<!DOCTYPE html>
<html lang="zh-CN" data-theme="light">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1" />
    <meta name="generator" content="VuePress 2.0.0-beta.48" />
    <meta name="theme" content="VuePress Theme Hope" />
    <meta property="og:url" content="https://vuepress-theme-hope-v2-demo.mrhope.site/zh/interview/MySQL.html"><meta property="og:site_name" content="主题演示"><meta property="og:title" content="MySQL"><meta property="og:type" content="article"><meta property="og:locale" content="zh-CN"><meta property="og:locale:alternate" content="en-US"><meta property="article:tag" content="MySQL"><title>MySQL | 主题演示</title><meta name="description" content="vuepress-theme-hope 的演示">
    <style>
      :root {
        --bg-color: #fff;
      }

      html[data-theme="dark"] {
        --bg-color: #1d2025;
      }

      html,
      body {
        background-color: var(--bg-color);
      }
    </style>
    <script>
      const userMode = localStorage.getItem("vuepress-theme-hope-scheme");
      const systemDarkMode =
        window.matchMedia &&
        window.matchMedia("(prefers-color-scheme: dark)").matches;

      if (userMode === "dark" || (userMode !== "light" && systemDarkMode)) {
        document.querySelector("html").setAttribute("data-theme", "dark");
      }
    </script>
    <link rel="stylesheet" href="/assets/style.dbbe025d.css">
    <link rel="modulepreload" href="/assets/app.e732cc94.js"><link rel="modulepreload" href="/assets/MySQL.html.eba28d84.js"><link rel="modulepreload" href="/assets/plugin-vue_export-helper.21dcd24c.js"><link rel="modulepreload" href="/assets/MySQL.html.73ae62bf.js"><link rel="prefetch" href="/assets/home.html.d675c4b6.js"><link rel="prefetch" href="/assets/intro.html.684ef626.js"><link rel="prefetch" href="/assets/index.html.e8ffec66.js"><link rel="prefetch" href="/assets/slide.html.050a6f1e.js"><link rel="prefetch" href="/assets/disable.html.b507ecac.js"><link rel="prefetch" href="/assets/encrypt.html.762116d5.js"><link rel="prefetch" href="/assets/markdown.html.5acf7a9a.js"><link rel="prefetch" href="/assets/page.html.141b0147.js"><link rel="prefetch" href="/assets/index.html.75bf4c69.js"><link rel="prefetch" href="/assets/article10.html.f5ea4d77.js"><link rel="prefetch" href="/assets/article11.html.6339c214.js"><link rel="prefetch" href="/assets/article12.html.5ac86a8f.js"><link rel="prefetch" href="/assets/article9.html.666c37a0.js"><link rel="prefetch" href="/assets/home.html.6e361c52.js"><link rel="prefetch" href="/assets/index.html.2d9b62a7.js"><link rel="prefetch" href="/assets/slide.html.6b655fa0.js"><link rel="prefetch" href="/assets/article1.html.f835efef.js"><link rel="prefetch" href="/assets/article2.html.e4775195.js"><link rel="prefetch" href="/assets/article3.html.bfdf934f.js"><link rel="prefetch" href="/assets/article4.html.69bccee4.js"><link rel="prefetch" href="/assets/article5.html.c7ac5439.js"><link rel="prefetch" href="/assets/article6.html.880c0652.js"><link rel="prefetch" href="/assets/article7.html.2cae84db.js"><link rel="prefetch" href="/assets/article8.html.6c46837c.js"><link rel="prefetch" href="/assets/disable.html.f629efab.js"><link rel="prefetch" href="/assets/encrypt.html.58d61689.js"><link rel="prefetch" href="/assets/markdown.html.779c42bf.js"><link rel="prefetch" href="/assets/page.html.125d74f5.js"><link rel="prefetch" href="/assets/index.html.3db704fb.js"><link rel="prefetch" href="/assets/article10.html.b5d65d2d.js"><link rel="prefetch" href="/assets/article11.html.b2cf93ee.js"><link rel="prefetch" href="/assets/article12.html.94e1cf22.js"><link rel="prefetch" href="/assets/article9.html.90cf2a62.js"><link rel="prefetch" href="/assets/Docker.html.de1063e8.js"><link rel="prefetch" href="/assets/Java基础.html.6c0b0f5c.js"><link rel="prefetch" href="/assets/Java容器.html.77448ff5.js"><link rel="prefetch" href="/assets/JUC.html.76307785.js"><link rel="prefetch" href="/assets/JVM.html.0bb340ff.js"><link rel="prefetch" href="/assets/Linux.html.90ea1c3b.js"><link rel="prefetch" href="/assets/NIO与Netty.html.a73529b1.js"><link rel="prefetch" href="/assets/index.html.2a38d188.js"><link rel="prefetch" href="/assets/Redis.html.78427b11.js"><link rel="prefetch" href="/assets/主流框架.html.f21f66df.js"><link rel="prefetch" href="/assets/分布式与高性能高可用.html.38ab4746.js"><link rel="prefetch" href="/assets/操作系统.html.76b600e3.js"><link rel="prefetch" href="/assets/智力题.html.ec368cec.js"><link rel="prefetch" href="/assets/系统设计.html.fb8f2074.js"><link rel="prefetch" href="/assets/计算机网络.html.1a7f7d0e.js"><link rel="prefetch" href="/assets/设计模式.html.cd48ccf5.js"><link rel="prefetch" href="/assets/article1.html.ca54de60.js"><link rel="prefetch" href="/assets/article2.html.a99d479f.js"><link rel="prefetch" href="/assets/article3.html.5a2797ee.js"><link rel="prefetch" href="/assets/article4.html.3ac5a509.js"><link rel="prefetch" href="/assets/article5.html.c09d20ba.js"><link rel="prefetch" href="/assets/article6.html.c9e59f52.js"><link rel="prefetch" href="/assets/article7.html.948e77cc.js"><link rel="prefetch" href="/assets/article8.html.28c3977f.js"><link rel="prefetch" href="/assets/404.html.8a909211.js"><link rel="prefetch" href="/assets/index.html.690b188a.js"><link rel="prefetch" href="/assets/index.html.6085d793.js"><link rel="prefetch" href="/assets/index.html.932078ca.js"><link rel="prefetch" href="/assets/index.html.bb629f30.js"><link rel="prefetch" href="/assets/index.html.92b2d70c.js"><link rel="prefetch" href="/assets/index.html.82840baf.js"><link rel="prefetch" href="/assets/index.html.85406aa8.js"><link rel="prefetch" href="/assets/index.html.7b9124b8.js"><link rel="prefetch" href="/assets/index.html.e1e2a548.js"><link rel="prefetch" href="/assets/index.html.a9a69593.js"><link rel="prefetch" href="/assets/index.html.5b51b72b.js"><link rel="prefetch" href="/assets/index.html.ec7f0295.js"><link rel="prefetch" href="/assets/index.html.e14e2286.js"><link rel="prefetch" href="/assets/index.html.e89216be.js"><link rel="prefetch" href="/assets/index.html.c0adb933.js"><link rel="prefetch" href="/assets/index.html.a45798a3.js"><link rel="prefetch" href="/assets/index.html.e99c516b.js"><link rel="prefetch" href="/assets/index.html.f6be7fb4.js"><link rel="prefetch" href="/assets/index.html.6812b391.js"><link rel="prefetch" href="/assets/index.html.4bae905e.js"><link rel="prefetch" href="/assets/index.html.0599248b.js"><link rel="prefetch" href="/assets/index.html.963b2596.js"><link rel="prefetch" href="/assets/index.html.bbd9778f.js"><link rel="prefetch" href="/assets/index.html.c6a7a8d4.js"><link rel="prefetch" href="/assets/index.html.13391f8f.js"><link rel="prefetch" href="/assets/index.html.4b0a0f3f.js"><link rel="prefetch" href="/assets/index.html.bbd06d0d.js"><link rel="prefetch" href="/assets/index.html.9a4d8710.js"><link rel="prefetch" href="/assets/index.html.dfdff039.js"><link rel="prefetch" href="/assets/index.html.cd21ad11.js"><link rel="prefetch" href="/assets/index.html.72b3c545.js"><link rel="prefetch" href="/assets/index.html.0262e65d.js"><link rel="prefetch" href="/assets/index.html.8905ca40.js"><link rel="prefetch" href="/assets/index.html.98e54f53.js"><link rel="prefetch" href="/assets/index.html.707c5120.js"><link rel="prefetch" href="/assets/index.html.daf3ede2.js"><link rel="prefetch" href="/assets/index.html.ae769b93.js"><link rel="prefetch" href="/assets/index.html.59a75e1b.js"><link rel="prefetch" href="/assets/index.html.efb1d101.js"><link rel="prefetch" href="/assets/index.html.898df6f8.js"><link rel="prefetch" href="/assets/index.html.6339ac7f.js"><link rel="prefetch" href="/assets/index.html.0ffdd311.js"><link rel="prefetch" href="/assets/index.html.454f52cf.js"><link rel="prefetch" href="/assets/index.html.d8a5ddde.js"><link rel="prefetch" href="/assets/index.html.3be06723.js"><link rel="prefetch" href="/assets/index.html.1d180388.js"><link rel="prefetch" href="/assets/index.html.337241b0.js"><link rel="prefetch" href="/assets/index.html.0be3cd3f.js"><link rel="prefetch" href="/assets/index.html.8e5505d4.js"><link rel="prefetch" href="/assets/index.html.ffdd1452.js"><link rel="prefetch" href="/assets/index.html.d3825f4c.js"><link rel="prefetch" href="/assets/home.html.ccae7996.js"><link rel="prefetch" href="/assets/intro.html.fd34d8e1.js"><link rel="prefetch" href="/assets/index.html.ba786069.js"><link rel="prefetch" href="/assets/slide.html.0df38877.js"><link rel="prefetch" href="/assets/disable.html.6465acbf.js"><link rel="prefetch" href="/assets/encrypt.html.f697c2c7.js"><link rel="prefetch" href="/assets/markdown.html.f534aa4c.js"><link rel="prefetch" href="/assets/page.html.d91d46f6.js"><link rel="prefetch" href="/assets/index.html.b66745bd.js"><link rel="prefetch" href="/assets/article10.html.a245f19a.js"><link rel="prefetch" href="/assets/article11.html.c7128e02.js"><link rel="prefetch" href="/assets/article12.html.abd25c27.js"><link rel="prefetch" href="/assets/article9.html.7bba6b9f.js"><link rel="prefetch" href="/assets/home.html.eb29b64c.js"><link rel="prefetch" href="/assets/index.html.a51898c1.js"><link rel="prefetch" href="/assets/slide.html.4db0d16b.js"><link rel="prefetch" href="/assets/article1.html.8aeaf420.js"><link rel="prefetch" href="/assets/article2.html.1b3af75b.js"><link rel="prefetch" href="/assets/article3.html.83bc62c6.js"><link rel="prefetch" href="/assets/article4.html.9c3e20ef.js"><link rel="prefetch" href="/assets/article5.html.a86dfd69.js"><link rel="prefetch" href="/assets/article6.html.1005b310.js"><link rel="prefetch" href="/assets/article7.html.e62a511b.js"><link rel="prefetch" href="/assets/article8.html.5d7e1f67.js"><link rel="prefetch" href="/assets/disable.html.9d48f34e.js"><link rel="prefetch" href="/assets/encrypt.html.69059b41.js"><link rel="prefetch" href="/assets/markdown.html.f8f89db4.js"><link rel="prefetch" href="/assets/page.html.f139635c.js"><link rel="prefetch" href="/assets/index.html.126e92a0.js"><link rel="prefetch" href="/assets/article10.html.f00bfbec.js"><link rel="prefetch" href="/assets/article11.html.4e4aea0e.js"><link rel="prefetch" href="/assets/article12.html.ed056ef8.js"><link rel="prefetch" href="/assets/article9.html.c3cb96a4.js"><link rel="prefetch" href="/assets/Docker.html.f45c96a5.js"><link rel="prefetch" href="/assets/Java基础.html.56267f30.js"><link rel="prefetch" href="/assets/Java容器.html.5139503a.js"><link rel="prefetch" href="/assets/JUC.html.ebe8f287.js"><link rel="prefetch" href="/assets/JVM.html.c448b42c.js"><link rel="prefetch" href="/assets/Linux.html.43840acf.js"><link rel="prefetch" href="/assets/NIO与Netty.html.66d42188.js"><link rel="prefetch" href="/assets/index.html.f3cc61a2.js"><link rel="prefetch" href="/assets/Redis.html.d810a669.js"><link rel="prefetch" href="/assets/主流框架.html.48ca457c.js"><link rel="prefetch" href="/assets/分布式与高性能高可用.html.a85c8cdb.js"><link rel="prefetch" href="/assets/操作系统.html.c2f0370c.js"><link rel="prefetch" href="/assets/智力题.html.4d751983.js"><link rel="prefetch" href="/assets/系统设计.html.c1542e9d.js"><link rel="prefetch" href="/assets/计算机网络.html.724e0903.js"><link rel="prefetch" href="/assets/设计模式.html.2465754d.js"><link rel="prefetch" href="/assets/article1.html.ac18bda1.js"><link rel="prefetch" href="/assets/article2.html.051f8867.js"><link rel="prefetch" href="/assets/article3.html.ebe7849b.js"><link rel="prefetch" href="/assets/article4.html.a4dbc976.js"><link rel="prefetch" href="/assets/article5.html.395a5403.js"><link rel="prefetch" href="/assets/article6.html.74c49cbf.js"><link rel="prefetch" href="/assets/article7.html.bf053e97.js"><link rel="prefetch" href="/assets/article8.html.7213c414.js"><link rel="prefetch" href="/assets/404.html.22aaa4fc.js"><link rel="prefetch" href="/assets/index.html.bd6ff77c.js"><link rel="prefetch" href="/assets/index.html.a7880d9d.js"><link rel="prefetch" href="/assets/index.html.f5f99f6a.js"><link rel="prefetch" href="/assets/index.html.561cd4cd.js"><link rel="prefetch" href="/assets/index.html.2b2206fe.js"><link rel="prefetch" href="/assets/index.html.ec6b7467.js"><link rel="prefetch" href="/assets/index.html.146ab8c4.js"><link rel="prefetch" href="/assets/index.html.f201f6e8.js"><link rel="prefetch" href="/assets/index.html.a1a6c5d4.js"><link rel="prefetch" href="/assets/index.html.61b33c23.js"><link rel="prefetch" href="/assets/index.html.8640e57f.js"><link rel="prefetch" href="/assets/index.html.c3d0fc1d.js"><link rel="prefetch" href="/assets/index.html.461f8cdf.js"><link rel="prefetch" href="/assets/index.html.1dea7bef.js"><link rel="prefetch" href="/assets/index.html.e6addda8.js"><link rel="prefetch" href="/assets/index.html.2638e7e9.js"><link rel="prefetch" href="/assets/index.html.5db2b8e8.js"><link rel="prefetch" href="/assets/index.html.cbff7fea.js"><link rel="prefetch" href="/assets/index.html.5ac21d40.js"><link rel="prefetch" href="/assets/index.html.c7acfbee.js"><link rel="prefetch" href="/assets/index.html.fb44feb1.js"><link rel="prefetch" href="/assets/index.html.d4e476c9.js"><link rel="prefetch" href="/assets/index.html.ec5764c9.js"><link rel="prefetch" href="/assets/index.html.d185c9f1.js"><link rel="prefetch" href="/assets/index.html.0867f7ab.js"><link rel="prefetch" href="/assets/index.html.2c3899c7.js"><link rel="prefetch" href="/assets/index.html.8a2aee35.js"><link rel="prefetch" href="/assets/index.html.130e4c85.js"><link rel="prefetch" href="/assets/index.html.7277b095.js"><link rel="prefetch" href="/assets/index.html.c074ddbd.js"><link rel="prefetch" href="/assets/index.html.e91a40c5.js"><link rel="prefetch" href="/assets/index.html.0b2b027d.js"><link rel="prefetch" href="/assets/index.html.6b602146.js"><link rel="prefetch" href="/assets/index.html.16d4af72.js"><link rel="prefetch" href="/assets/index.html.b8fc0dcc.js"><link rel="prefetch" href="/assets/index.html.9b3fcbd9.js"><link rel="prefetch" href="/assets/index.html.eeb89bf7.js"><link rel="prefetch" href="/assets/index.html.5114cd1e.js"><link rel="prefetch" href="/assets/index.html.b8354286.js"><link rel="prefetch" href="/assets/index.html.fcd579df.js"><link rel="prefetch" href="/assets/index.html.e743d320.js"><link rel="prefetch" href="/assets/index.html.b34f28e1.js"><link rel="prefetch" href="/assets/index.html.dd5dd927.js"><link rel="prefetch" href="/assets/index.html.7df41339.js"><link rel="prefetch" href="/assets/index.html.9de9b7ae.js"><link rel="prefetch" href="/assets/index.html.db158b25.js"><link rel="prefetch" href="/assets/index.html.fcab0b26.js"><link rel="prefetch" href="/assets/index.html.afada1db.js"><link rel="prefetch" href="/assets/index.html.8681058b.js"><link rel="prefetch" href="/assets/index.html.1c990d16.js"><link rel="prefetch" href="/assets/index.html.9563932e.js"><link rel="prefetch" href="/assets/404.4ba82410.js"><link rel="prefetch" href="/assets/Layout.67323a43.js"><link rel="prefetch" href="/assets/Slide.be972901.js"><link rel="prefetch" href="/assets/Blog.caaad5e4.js"><link rel="prefetch" href="/assets/giscus.es.63137db5.js"><link rel="prefetch" href="/assets/auto.esm.36809f22.js"><link rel="prefetch" href="/assets/index.daae04bf.js"><link rel="prefetch" href="/assets/index.1842ee54.js"><link rel="prefetch" href="/assets/mermaid.esm.min.ee1e0284.js"><link rel="prefetch" href="/assets/highlight.esm.d982e650.js"><link rel="prefetch" href="/assets/markdown.esm.832a189d.js"><link rel="prefetch" href="/assets/math.esm.a3f84b6f.js"><link rel="prefetch" href="/assets/notes.esm.3c361cb7.js"><link rel="prefetch" href="/assets/reveal.esm.b96f05d8.js"><link rel="prefetch" href="/assets/search.esm.80da4a02.js"><link rel="prefetch" href="/assets/zoom.esm.8514a202.js"><link rel="prefetch" href="/assets/photoswipe.esm.092fbc15.js">
  </head>
  <body>
    <div id="app"><!--[--><!--[--><!--[--><span tabindex="-1"></span><a href="#main-content" class="skip-link sr-only">Skip to content</a><!--]--><div class="theme-container has-toc"><!--[--><!--[--><header class="navbar"><div class="navbar-left"><button class="toggle-sidebar-button" title="Toggle Sidebar"><span class="icon"></span></button><!----><a href="/zh/" class="brand"><img class="logo" src="/logo.svg" alt="主题演示"><!----><span class="site-name hide-in-pad">主题演示</span></a><!----></div><div class="navbar-center"><!----><nav class="nav-links"><div class="nav-item hide-in-mobile"><a href="/zh/" class="nav-link" aria-label="博客主页"><span class="icon iconfont icon-home" style=""></span>博客主页<!----></a></div><div class="nav-item hide-in-mobile"><a href="/zh/home.html" class="nav-link" aria-label="项目主页"><span class="icon iconfont icon-home" style=""></span>项目主页<!----></a></div><div class="nav-item hide-in-mobile"><a href="/zh/guide/" class="nav-link" aria-label="使用指南"><span class="icon iconfont icon-creative" style=""></span>使用指南<!----></a></div><div class="nav-item hide-in-mobile"><div class="dropdown-wrapper"><button class="dropdown-title" type="button" aria-label="博文"><span class="title"><span class="icon iconfont icon-edit" style=""></span>博文</span><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><h4 class="dropdown-subtitle"><span>文章 1-4</span></h4><ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/zh/posts/article/article1.html" class="nav-link" aria-label="文章 1"><span class="icon iconfont icon-edit" style=""></span>文章 1<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article2.html" class="nav-link" aria-label="文章 2"><span class="icon iconfont icon-edit" style=""></span>文章 2<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article3.html" class="nav-link" aria-label="文章 3"><span class="icon iconfont icon-edit" style=""></span>文章 3<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article4.html" class="nav-link" aria-label="文章 4"><span class="icon iconfont icon-edit" style=""></span>文章 4<!----></a></li></ul></li><li class="dropdown-item"><h4 class="dropdown-subtitle"><span>文章 5-12</span></h4><ul class="dropdown-subitem-wrapper"><li class="dropdown-subitem"><a href="/zh/posts/article/article5.html" class="nav-link" aria-label="文章 5"><span class="icon iconfont icon-edit" style=""></span>文章 5<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article6.html" class="nav-link" aria-label="文章 6"><span class="icon iconfont icon-edit" style=""></span>文章 6<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article7.html" class="nav-link" aria-label="文章 7"><span class="icon iconfont icon-edit" style=""></span>文章 7<!----></a></li><li class="dropdown-subitem"><a href="/zh/posts/article/article8.html" class="nav-link" aria-label="文章 8"><span class="icon iconfont icon-edit" style=""></span>文章 8<!----></a></li></ul></li><li class="dropdown-item"><a href="/zh/posts/article9.html" class="nav-link" aria-label="文章 9"><span class="icon iconfont icon-edit" style=""></span>文章 9<!----></a></li><li class="dropdown-item"><a href="/zh/posts/article10.html" class="nav-link" aria-label="文章 10"><span class="icon iconfont icon-edit" style=""></span>文章 10<!----></a></li><li class="dropdown-item"><a href="/zh/posts/article11.html" class="nav-link" aria-label="文章 11"><span class="icon iconfont icon-edit" style=""></span>文章 11<!----></a></li><li class="dropdown-item"><a href="/zh/posts/article12.html" class="nav-link" aria-label="文章 12"><span class="icon iconfont icon-edit" style=""></span>文章 12<!----></a></li></ul></button></div></div><div class="nav-item hide-in-mobile"><a href="https://vuepress-theme-hope.github.io/v2/zh/" rel="noopener noreferrer" target="_blank" aria-label="主题文档" class="nav-link"><span class="icon iconfont icon-note" style=""></span>主题文档<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div></nav><!----></div><div class="navbar-right"><!----><div class="nav-item"><div class="dropdown-wrapper i18n-dropdown"><button class="dropdown-title" type="button" aria-label="选择语言"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon i18n-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="i18n icon" style="width:1rem;height:1rem;vertical-align:middle;"><path d="M379.392 460.8 494.08 575.488l-42.496 102.4L307.2 532.48 138.24 701.44l-71.68-72.704L234.496 460.8l-45.056-45.056c-27.136-27.136-51.2-66.56-66.56-108.544h112.64c7.68 14.336 16.896 27.136 26.112 35.84l45.568 46.08 45.056-45.056C382.976 312.32 409.6 247.808 409.6 204.8H0V102.4h256V0h102.4v102.4h256v102.4H512c0 70.144-37.888 161.28-87.04 210.944L378.88 460.8zM576 870.4 512 1024H409.6l256-614.4H768l256 614.4H921.6l-64-153.6H576zM618.496 768h196.608L716.8 532.48 618.496 768z"></path></svg><!--]--><span class="arrow"></span><ul class="nav-dropdown"><li class="dropdown-item"><a href="/" class="nav-link" aria-label="English"><!---->English<!----></a></li><li class="dropdown-item"><a aria-current="page" href="/zh/interview/MySQL.html" class="router-link-active router-link-exact-active nav-link active" aria-label="简体中文"><!---->简体中文<!----></a></li></ul></button></div></div><div class="nav-item"><a class="repo-link" href="https://gitee.com/changluJava/personal-reading" target="_blank" rel="noopener noreferrer" aria-label="Gitee"><svg xmlns="http://www.w3.org/2000/svg" class="icon gitee-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="gitee icon" style="width:1.25rem;height:1.25rem;vertical-align:middle;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm242.97-533.34H482.39a23.7 23.7 0 0 0-23.7 23.7l-.03 59.28c0 13.08 10.59 23.7 23.7 23.7h165.96a23.7 23.7 0 0 1 23.7 23.7v11.85a71.1 71.1 0 0 1-71.1 71.1H375.71a23.7 23.7 0 0 1-23.7-23.7V423.11a71.1 71.1 0 0 1 71.1-71.1h331.8a23.7 23.7 0 0 0 23.7-23.7l.06-59.25a23.73 23.73 0 0 0-23.7-23.73H423.11a177.78 177.78 0 0 0-177.78 177.75v331.83c0 13.08 10.62 23.7 23.7 23.7h349.62a159.99 159.99 0 0 0 159.99-159.99V482.33a23.7 23.7 0 0 0-23.7-23.7z"></path></svg></a></div><div class="nav-item hide-in-mobile"><button id="appearance-switch"><svg xmlns="http://www.w3.org/2000/svg" class="icon auto-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="auto icon" style="display:block;"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon dark-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="dark icon" style="display:none;"><path d="M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" class="icon light-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="light icon" style="display:none;"><path d="M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"></path></svg></button></div><!----><!----><button class="toggle-navbar-button" aria-label="Toggle Navbar" aria-expanded="false" aria-controls="nav-screen"><span class="button-container"><span class="button-top"></span><span class="button-middle"></span><span class="button-bottom"></span></span></button></div></header><!----><!--]--><!----><div class="toggle-sidebar-wrapper"><span class="arrow left"></span></div><aside class="sidebar"><!--[--><!----><!--]--><ul class="sidebar-links"><li><!--[--><a href="/zh/" class="nav-link sidebar-link sidebar-page" aria-label="博客主页"><span class="icon iconfont icon-home" style=""></span>博客主页<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/home.html" class="nav-link sidebar-link sidebar-page" aria-label="项目主页"><span class="icon iconfont icon-home" style=""></span>项目主页<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/slide" class="nav-link sidebar-link sidebar-page" aria-label="幻灯片"><!---->幻灯片<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><section class="sidebar-group"><button class="sidebar-heading clickable active"><span class="icon iconfont icon-creative" style=""></span><a href="/zh/interview/" class="title">面试指南</a><span class="arrow down"></span></button><ul class="sidebar-links"><li><!--[--><a href="/zh/interview/Docker.html" class="nav-link sidebar-link sidebar-page" aria-label="Docker"><span class="icon iconfont icon-lock" style=""></span>Docker<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/Java%E5%9F%BA%E7%A1%80.html" class="nav-link sidebar-link sidebar-page" aria-label="JAVA"><span class="icon iconfont icon-lock" style=""></span>JAVA<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/Java%E5%AE%B9%E5%99%A8.html" class="nav-link sidebar-link sidebar-page" aria-label="Java容器"><span class="icon iconfont icon-lock" style=""></span>Java容器<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/JUC.html" class="nav-link sidebar-link sidebar-page" aria-label="JUC"><span class="icon iconfont icon-lock" style=""></span>JUC<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/JVM.html" class="nav-link sidebar-link sidebar-page" aria-label="JVM"><span class="icon iconfont icon-lock" style=""></span>JVM<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/Linux.html" class="nav-link sidebar-link sidebar-page" aria-label="Linux"><span class="icon iconfont icon-lock" style=""></span>Linux<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a aria-current="page" href="/zh/interview/MySQL.html" class="router-link-active router-link-exact-active nav-link active sidebar-link sidebar-page active" aria-label="MySQL"><span class="icon iconfont icon-lock" style=""></span>MySQL<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#数据库基础知识总结" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="数据库基础知识总结"><!---->数据库基础知识总结<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、delete、truncate与drop区别" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、delete、truncate与drop区别"><!---->1、delete、truncate与drop区别<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、数据库设计分为哪几步" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、数据库设计分为哪几步？"><!---->2、数据库设计分为哪几步？<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、mysql的基础架构" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、MySQL的基础架构"><!---->1、MySQL的基础架构<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、mysql-存储引擎" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、MySQL 存储引擎"><!---->2、MySQL 存储引擎<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、mysql-支持哪些存储引擎-默认使用哪个" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、MySQL 支持哪些存储引擎？默认使用哪个？"><!---->1、MySQL 支持哪些存储引擎？默认使用哪个？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、mysql-存储引擎架构了解吗" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、MySQL 存储引擎架构了解吗？"><!---->2、MySQL 存储引擎架构了解吗？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_3、myisam-和-innodb-的区别是什么" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="3、MyISAM 和 InnoDB 的区别是什么？"><!---->3、MyISAM 和 InnoDB 的区别是什么？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_4、myisam-和-innodb-如何选择" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="4、MyISAM 和 InnoDB 如何选择？"><!---->4、MyISAM 和 InnoDB 如何选择？<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_3、-mysql-查询缓存" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="3、 MySQL 查询缓存"><!---->3、 MySQL 查询缓存<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_4、mysql事务" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="4、MySQL事务"><!---->4、MySQL事务<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、什么是事务" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、什么是事务？"><!---->1、什么是事务？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、何谓数据库事务-acid" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、何谓数据库事务？ACID"><!---->2、何谓数据库事务？ACID<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_3、并发事务带来了哪些问题" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="3、并发事务带来了哪些问题?"><!---->3、并发事务带来了哪些问题?<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_4、sql-标准定义了哪些事务隔离级别" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="4、SQL 标准定义了哪些事务隔离级别?"><!---->4、SQL 标准定义了哪些事务隔离级别?<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_5、mysql-的隔离级别是基于锁实现的吗" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="5、MySQL 的隔离级别是基于锁实现的吗？"><!---->5、MySQL 的隔离级别是基于锁实现的吗？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_6、mysql-的默认隔离级别是什么" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="6、MySQL 的默认隔离级别是什么?"><!---->6、MySQL 的默认隔离级别是什么?<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_7、解决幻读的方法" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="7、解决幻读的方法"><!---->7、解决幻读的方法<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_5、mysql-锁" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="5、MySQL 锁"><!---->5、MySQL 锁<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、表级锁和行级锁了解吗-有什么区别" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、表级锁和行级锁了解吗？有什么区别？"><!---->1、表级锁和行级锁了解吗？有什么区别？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、行级锁的使用有什么注意事项" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、行级锁的使用有什么注意事项？"><!---->2、行级锁的使用有什么注意事项？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_3、共享锁和排他锁呢" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="3、共享锁和排他锁呢？"><!---->3、共享锁和排他锁呢？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_4、意向锁有什么作用" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="4、意向锁有什么作用？"><!---->4、意向锁有什么作用？<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_5、innodb-有哪几类行锁" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="5、InnoDB 有哪几类行锁？"><!---->5、InnoDB 有哪几类行锁？<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_6、索引" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="6、索引"><!---->6、索引<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、索引规范" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、索引规范"><!---->1、索引规范<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、索引详解" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、索引详解"><!---->2、索引详解<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_7、mysql三大日志" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="7、MySQL三大日志"><!---->7、MySQL三大日志<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#redo-log" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="redo log"><!---->redo log<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#binlog" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="binlog"><!---->binlog<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#二阶段提交" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="二阶段提交"><!---->二阶段提交<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#undo-log" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="undo log"><!---->undo log<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#总结" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="总结"><!---->总结<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_8、innodb存储引擎对mvcc的实现" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="8、InnoDB存储引擎对MVCC的实现"><!---->8、InnoDB存储引擎对MVCC的实现<!----></a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#请你说说innodb的mvcc" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="请你说说InnoDB的MVCC"><!---->请你说说InnoDB的MVCC<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_1、一致性非锁定都与锁定读" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="1、一致性非锁定都与锁定读"><!---->1、一致性非锁定都与锁定读<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_2、innodb-对-mvcc-的实现原理以及readview介绍" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="2、InnoDB 对 MVCC 的实现原理以及ReadView介绍"><!---->2、InnoDB 对 MVCC 的实现原理以及ReadView介绍<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_3、快照读与当前读" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="3、快照读与当前读"><!---->3、快照读与当前读<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_4、rc-和-rr-隔离级别下-mvcc-的差异" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="4、RC 和 RR 隔离级别下 MVCC 的差异"><!---->4、RC 和 RR 隔离级别下 MVCC 的差异<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_5、-mvcc-解决不可重复读问题" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="5、 MVCC 解决不可重复读问题"><!---->5、 MVCC 解决不可重复读问题<!----></a><ul class="sidebar-sub-headers"></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_6、mvcc➕next-key-lock-防止幻读" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="6、MVCC➕Next-key-Lock 防止幻读"><!---->6、MVCC➕Next-key-Lock 防止幻读<!----></a><ul class="sidebar-sub-headers"></ul></li></ul></li><li class="sidebar-sub-header"><a aria-current="page" href="/zh/interview/MySQL.html#_9、sql语句在mysql中的执行过程" class="router-link-active router-link-exact-active nav-link sidebar-link heading" aria-label="9、SQL语句在MySQL中的执行过程"><!---->9、SQL语句在MySQL中的执行过程<!----></a><ul class="sidebar-sub-headers"></ul></li></ul><!--]--></li><li><!--[--><a href="/zh/interview/NIO%E4%B8%8ENetty.html" class="nav-link sidebar-link sidebar-page" aria-label="Netty"><span class="icon iconfont icon-lock" style=""></span>Netty<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/Redis.html" class="nav-link sidebar-link sidebar-page" aria-label="Redis"><span class="icon iconfont icon-lock" style=""></span>Redis<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E4%B8%BB%E6%B5%81%E6%A1%86%E6%9E%B6.html" class="nav-link sidebar-link sidebar-page" aria-label="主流框架"><span class="icon iconfont icon-lock" style=""></span>主流框架<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E5%88%86%E5%B8%83%E5%BC%8F%E4%B8%8E%E9%AB%98%E6%80%A7%E8%83%BD%E9%AB%98%E5%8F%AF%E7%94%A8.html" class="nav-link sidebar-link sidebar-page" aria-label="分布式"><span class="icon iconfont icon-lock" style=""></span>分布式<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html" class="nav-link sidebar-link sidebar-page" aria-label="操作系统"><span class="icon iconfont icon-lock" style=""></span>操作系统<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E6%99%BA%E5%8A%9B%E9%A2%98.html" class="nav-link sidebar-link sidebar-page" aria-label="智力题"><span class="icon iconfont icon-lock" style=""></span>智力题<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1.html" class="nav-link sidebar-link sidebar-page" aria-label="系统设计"><span class="icon iconfont icon-lock" style=""></span>系统设计<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.html" class="nav-link sidebar-link sidebar-page" aria-label="计算机网络"><span class="icon iconfont icon-lock" style=""></span>计算机网络<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/interview/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.html" class="nav-link sidebar-link sidebar-page" aria-label="设计模式"><!---->设计模式<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li></ul></section><!--]--></li><li><!--[--><section class="sidebar-group"><p class="sidebar-heading clickable"><span class="icon iconfont icon-creative" style=""></span><a href="/zh/guide/" class="title">如何使用</a><!----></p><ul class="sidebar-links"><li><!--[--><a href="/zh/guide/page.html" class="nav-link sidebar-link sidebar-page" aria-label="页面配置"><span class="icon iconfont icon-page" style=""></span>页面配置<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/guide/markdown.html" class="nav-link sidebar-link sidebar-page" aria-label="Markdown 展示"><span class="icon iconfont icon-markdown" style=""></span>Markdown 展示<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/guide/disable.html" class="nav-link sidebar-link sidebar-page" aria-label="布局与功能禁用"><span class="icon iconfont icon-config" style=""></span>布局与功能禁用<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/guide/encrypt.html" class="nav-link sidebar-link sidebar-page" aria-label="密码加密的文章"><span class="icon iconfont icon-lock" style=""></span>密码加密的文章<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li></ul></section><!--]--></li><li><!--[--><section class="sidebar-group"><p class="sidebar-heading"><span class="icon iconfont icon-note" style=""></span><span class="title">文章</span><!----></p><ul class="sidebar-links"><li><!--[--><section class="sidebar-group"><button class="sidebar-heading clickable"><span class="icon iconfont icon-note" style=""></span><span class="title">文章 1-4</span><span class="arrow right"></span></button><!----></section><!--]--></li><li><!--[--><section class="sidebar-group"><p class="sidebar-heading"><span class="icon iconfont icon-note" style=""></span><span class="title">文章 5-12</span><!----></p><ul class="sidebar-links"><li><!--[--><section class="sidebar-group"><button class="sidebar-heading clickable"><span class="icon iconfont icon-note" style=""></span><span class="title">文章 5-8</span><span class="arrow right"></span></button><!----></section><!--]--></li><li><!--[--><section class="sidebar-group"><p class="sidebar-heading"><span class="icon iconfont icon-note" style=""></span><span class="title">文章 9-12</span><!----></p><ul class="sidebar-links"><li><!--[--><a href="/zh/posts/article9.html" class="nav-link sidebar-link sidebar-page" aria-label="文章 9"><span class="icon iconfont icon-edit" style=""></span>文章 9<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/posts/article10.html" class="nav-link sidebar-link sidebar-page" aria-label="文章 10"><span class="icon iconfont icon-edit" style=""></span>文章 10<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/posts/article11.html" class="nav-link sidebar-link sidebar-page" aria-label="文章 11"><span class="icon iconfont icon-edit" style=""></span>文章 11<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li><li><!--[--><a href="/zh/posts/article12.html" class="nav-link sidebar-link sidebar-page" aria-label="文章 12"><span class="icon iconfont icon-edit" style=""></span>文章 12<!----></a><ul class="sidebar-sub-headers"></ul><!--]--></li></ul></section><!--]--></li></ul></section><!--]--></li></ul></section><!--]--></li></ul><!--[--><!----><!--]--></aside><!--[--><main class="page" id="main-content"><!--[--><!----><nav class="breadcrumb disable"></nav><div class="page-title"><h1><span class="icon iconfont icon-lock" style=""></span>MySQL</h1><div class="page-info"><span class="author-info" aria-label="作者🖊" data-balloon-pos="down" isoriginal="false" pageview="false"><svg xmlns="http://www.w3.org/2000/svg" class="icon author-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="author icon"><path d="M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"></path></svg><span><a class="author-item" href="https://changlu.blog.csdn.net" target="_blank" rel="noopener noreferrer">长路</a></span><span property="author" content="长路"></span></span><!----><!----><span class="category-info" aria-label="分类🌈" data-balloon-pos="down" isoriginal="false" pageview="false"><svg xmlns="http://www.w3.org/2000/svg" class="icon category-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="category icon"><path d="M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"></path></svg><ul class="categories-wrapper"><li class="category category8 clickable" role="navigation">面试题</li><meta property="articleSection" content="面试题"></ul></span><span aria-label="标签🏷" data-balloon-pos="down" isoriginal="false" pageview="false"><svg xmlns="http://www.w3.org/2000/svg" class="icon tag-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="tag icon"><path d="M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"></path></svg><ul class="tags-wrapper"><li class="tag tag3 clickable" role="navigation">MySQL</li></ul><meta property="keywords" content="MySQL"></span><span class="reading-time-info" aria-label="阅读时间⌛" data-balloon-pos="down" isoriginal="false" pageview="false"><svg xmlns="http://www.w3.org/2000/svg" class="icon timer-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="timer icon"><path d="M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"></path></svg><span>大约 41 分钟</span><meta property="timeRequired" content="PT41M"></span></div><hr></div><div class="toc-place-holder"><aside id="toc"><div class="toc-header">此页内容</div><div class="toc-wrapper"><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#数据库基础知识总结" class="router-link-active router-link-exact-active toc-link level2">数据库基础知识总结</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、delete、truncate与drop区别" class="router-link-active router-link-exact-active toc-link level3">1、delete、truncate与drop区别</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、数据库设计分为哪几步" class="router-link-active router-link-exact-active toc-link level3">2、数据库设计分为哪几步？</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、mysql的基础架构" class="router-link-active router-link-exact-active toc-link level2">1、MySQL的基础架构</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、mysql-存储引擎" class="router-link-active router-link-exact-active toc-link level2">2、MySQL 存储引擎</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、mysql-支持哪些存储引擎-默认使用哪个" class="router-link-active router-link-exact-active toc-link level3">1、MySQL 支持哪些存储引擎？默认使用哪个？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、mysql-存储引擎架构了解吗" class="router-link-active router-link-exact-active toc-link level3">2、MySQL 存储引擎架构了解吗？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_3、myisam-和-innodb-的区别是什么" class="router-link-active router-link-exact-active toc-link level3">3、MyISAM 和 InnoDB 的区别是什么？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_4、myisam-和-innodb-如何选择" class="router-link-active router-link-exact-active toc-link level3">4、MyISAM 和 InnoDB 如何选择？</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_3、-mysql-查询缓存" class="router-link-active router-link-exact-active toc-link level2">3、 MySQL 查询缓存</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_4、mysql事务" class="router-link-active router-link-exact-active toc-link level2">4、MySQL事务</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、什么是事务" class="router-link-active router-link-exact-active toc-link level3">1、什么是事务？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、何谓数据库事务-acid" class="router-link-active router-link-exact-active toc-link level3">2、何谓数据库事务？ACID</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_3、并发事务带来了哪些问题" class="router-link-active router-link-exact-active toc-link level3">3、并发事务带来了哪些问题?</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_4、sql-标准定义了哪些事务隔离级别" class="router-link-active router-link-exact-active toc-link level3">4、SQL 标准定义了哪些事务隔离级别?</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_5、mysql-的隔离级别是基于锁实现的吗" class="router-link-active router-link-exact-active toc-link level3">5、MySQL 的隔离级别是基于锁实现的吗？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_6、mysql-的默认隔离级别是什么" class="router-link-active router-link-exact-active toc-link level3">6、MySQL 的默认隔离级别是什么?</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_7、解决幻读的方法" class="router-link-active router-link-exact-active toc-link level3">7、解决幻读的方法</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_5、mysql-锁" class="router-link-active router-link-exact-active toc-link level2">5、MySQL 锁</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、表级锁和行级锁了解吗-有什么区别" class="router-link-active router-link-exact-active toc-link level3">1、表级锁和行级锁了解吗？有什么区别？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、行级锁的使用有什么注意事项" class="router-link-active router-link-exact-active toc-link level3">2、行级锁的使用有什么注意事项？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_3、共享锁和排他锁呢" class="router-link-active router-link-exact-active toc-link level3">3、共享锁和排他锁呢？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_4、意向锁有什么作用" class="router-link-active router-link-exact-active toc-link level3">4、意向锁有什么作用？</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_5、innodb-有哪几类行锁" class="router-link-active router-link-exact-active toc-link level3">5、InnoDB 有哪几类行锁？</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_6、索引" class="router-link-active router-link-exact-active toc-link level2">6、索引</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、索引规范" class="router-link-active router-link-exact-active toc-link level3">1、索引规范</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、索引详解" class="router-link-active router-link-exact-active toc-link level3">2、索引详解</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_7、mysql三大日志" class="router-link-active router-link-exact-active toc-link level2">7、MySQL三大日志</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#redo-log" class="router-link-active router-link-exact-active toc-link level3">redo log</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#binlog" class="router-link-active router-link-exact-active toc-link level3">binlog</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#二阶段提交" class="router-link-active router-link-exact-active toc-link level3">二阶段提交</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#undo-log" class="router-link-active router-link-exact-active toc-link level3">undo log</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#总结" class="router-link-active router-link-exact-active toc-link level3">总结</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_8、innodb存储引擎对mvcc的实现" class="router-link-active router-link-exact-active toc-link level2">8、InnoDB存储引擎对MVCC的实现</a></li><ul class="toc-list"><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#请你说说innodb的mvcc" class="router-link-active router-link-exact-active toc-link level3">请你说说InnoDB的MVCC</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_1、一致性非锁定都与锁定读" class="router-link-active router-link-exact-active toc-link level3">1、一致性非锁定都与锁定读</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_2、innodb-对-mvcc-的实现原理以及readview介绍" class="router-link-active router-link-exact-active toc-link level3">2、InnoDB 对 MVCC 的实现原理以及ReadView介绍</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_3、快照读与当前读" class="router-link-active router-link-exact-active toc-link level3">3、快照读与当前读</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_4、rc-和-rr-隔离级别下-mvcc-的差异" class="router-link-active router-link-exact-active toc-link level3">4、RC 和 RR 隔离级别下 MVCC 的差异</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_5、-mvcc-解决不可重复读问题" class="router-link-active router-link-exact-active toc-link level3">5、 MVCC 解决不可重复读问题</a></li><!----><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_6、mvcc➕next-key-lock-防止幻读" class="router-link-active router-link-exact-active toc-link level3">6、MVCC➕Next-key-Lock 防止幻读</a></li><!----><!--]--></ul><!--]--><!--[--><li class="toc-item"><a aria-current="page" href="/zh/interview/MySQL.html#_9、sql语句在mysql中的执行过程" class="router-link-active router-link-exact-active toc-link level2">9、SQL语句在MySQL中的执行过程</a></li><!----><!--]--></ul></div></aside></div><!----><div class="theme-hope-content"><h1 id="mysql" tabindex="-1"><a class="header-anchor" href="#mysql" aria-hidden="true">#</a> MySQL</h1><h2 id="数据库基础知识总结" tabindex="-1"><a class="header-anchor" href="#数据库基础知识总结" aria-hidden="true">#</a> 数据库基础知识总结</h2><h3 id="_1、delete、truncate与drop区别" tabindex="-1"><a class="header-anchor" href="#_1、delete、truncate与drop区别" aria-hidden="true">#</a> 1、delete、truncate与drop区别</h3><p>drop &gt; truncate &gt; delete</p><p><code>delete</code>命令执行的时候会产生数据库的<code>binlog</code>日志，而日志记录是需要消耗时间的，但是也有个好处方便数据回滚恢复。</p><p><code>truncate</code>命令执行的时候<strong>不会产生数据库日志</strong>，因此比<code>delete</code>要快。除此之外，还会把表的自增值重置和索引恢复到初始大小等。</p><p><code>drop</code>命令会把表占用的空间全部释放掉。</p><h3 id="_2、数据库设计分为哪几步" tabindex="-1"><a class="header-anchor" href="#_2、数据库设计分为哪几步" aria-hidden="true">#</a> 2、数据库设计分为哪几步？</h3><ol><li><strong>需求分析</strong> : 分析用户的需求，包括数据、功能和性能需求。</li><li><strong>概念结构设计</strong> : 主要采用 E-R 模型进行设计，包括画 E-R 图。</li><li><strong>逻辑结构设计</strong> : 通过将 E-R 图转换成表，实现从 E-R 模型到关系模型的转换。</li><li><strong>物理结构设计</strong> : 主要是为所设计的数据库选择合适的存储结构和存取路径。</li><li><strong>数据库实施</strong> : 包括编程、测试和试运行</li><li><strong>数据库的运行和维护</strong> : 系统的运行与数据库的日常维护。</li></ol><h2 id="_1、mysql的基础架构" tabindex="-1"><a class="header-anchor" href="#_1、mysql的基础架构" aria-hidden="true">#</a> 1、MySQL的基础架构</h2><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206152104995.png" alt="image-20220615210446924" loading="lazy"></p><p>组成结构：</p><ul><li><strong>连接器：</strong> 身份认证和权限相关(登录 MySQL 的时候)。</li><li><strong>查询缓存：</strong> 执行查询语句的时候，会先查询缓存（MySQL 8.0 版本后移除，因为这个功能不太实用）。</li><li><strong>分析器：</strong> 没有命中缓存的话，SQL 语句就会经过分析器，分析器说白了就是要先看你的 SQL 语句要干嘛，再检查你的 SQL 语句语法是否正确。</li><li><strong>优化器：</strong> 按照 MySQL 认为最优的方案去执行。</li><li><strong>执行器：</strong> 执行语句，然后从存储引擎返回数据。 执行语句之前会先判断是否有权限，如果没有权限的话，就会报错。</li><li><strong>插件式存储引擎</strong> ： 主要负责数据的存储和读取，采用的是插件式架构，支持 InnoDB、MyISAM、Memory 等多种存储引擎。</li></ul><h2 id="_2、mysql-存储引擎" tabindex="-1"><a class="header-anchor" href="#_2、mysql-存储引擎" aria-hidden="true">#</a> 2、MySQL 存储引擎</h2><h3 id="_1、mysql-支持哪些存储引擎-默认使用哪个" tabindex="-1"><a class="header-anchor" href="#_1、mysql-支持哪些存储引擎-默认使用哪个" aria-hidden="true">#</a> 1、MySQL 支持哪些存储引擎？默认使用哪个？</h3><p>MySQL 5.5.5 之前，MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后，InnoDB 是 MySQL 的默认存储引擎。</p><h3 id="_2、mysql-存储引擎架构了解吗" tabindex="-1"><a class="header-anchor" href="#_2、mysql-存储引擎架构了解吗" aria-hidden="true">#</a> 2、MySQL 存储引擎架构了解吗？</h3><p>MySQL 存储引擎采用的是插件式架构，支持多种存储引擎，我们甚至可以为不同的数据库表设置不同的存储引擎以适应不同场景的需要。<strong>存储引擎是基于表的，而不是数据库。</strong></p><p>其他：并且，你还可以根据 MySQL 定义的存储引擎实现标准接口来编写一个属于自己的存储引擎。这些非官方提供的存储引擎可以称为第三方存储引擎，区别于官方存储引擎。像目前最常用的 InnoDB 其实刚开始就是一个第三方存储引擎，后面由于过于优秀，其被 Oracle 直接收购了。</p><h3 id="_3、myisam-和-innodb-的区别是什么" tabindex="-1"><a class="header-anchor" href="#_3、myisam-和-innodb-的区别是什么" aria-hidden="true">#</a> 3、MyISAM 和 InnoDB 的区别是什么？</h3><p>在5.5之前，默认是<code>MyISAM</code>，性能还行，各种特性也还不错（比如全文索引、压缩、空间函数等），但是，<code>MyISAM </code><strong>不支持事务和行级锁</strong>，而且最大的缺陷就是崩溃后无法安全恢复。</p><p>MySQL 5.5.5 之前，MyISAM 是 MySQL 的默认存储引擎。5.5.5 版本之后，InnoDB 是 MySQL 的默认存储引擎。</p><p><strong>1.是否支持行级锁</strong></p><ul><li>MyISAM 只有表级锁(table-level locking)，而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。</li><li>也就说，MyISAM 一锁就是锁住了整张表，这在并发写的情况下是多么滴憨憨啊！这也是为什么 InnoDB 在并发写的时候，性能更牛皮了！</li></ul><p><strong>2.是否支持事务</strong></p><ul><li>MyISAM 不提供事务支持。</li><li>InnoDB 提供事务支持，实现了 SQL 标准定义了四个隔离级别，具有提交(commit)和回滚(rollback)事务的能力。并且，InnoDB 默认使用的 REPEATABLE-READ（可重读）隔离级别是可以解决幻读问题发生的（基于 MVCC 和 Next-Key Lock）。</li></ul><p><strong>3.是否支持外键</strong></p><ul><li>MyISAM 不支持，而 InnoDB 支持。</li><li>外键对于维护数据一致性非常有帮助，但是对性能有一定的损耗。因此，通常情况下，我们是不建议在实际生产项目中使用外键的，在业务代码中进行约束即可！</li></ul><p><strong>4.是否支持数据库异常崩溃后的安全恢复</strong></p><ul><li>MyISAM 不支持，而 InnoDB 支持。</li><li>使用 InnoDB 的数据库在异常崩溃后，数据库重新启动的时候会保证数据库恢复到崩溃前的状态。这个恢复的过程依赖于 <code>redo log</code> 。</li></ul><p><strong>5.是否支持 MVCC</strong></p><ul><li>MyISAM 不支持，而 InnoDB 支持。</li><li>毕竟 MyISAM 连行级锁都不支持。MVCC 可以看作是行级锁的一个升级，可以有效减少加锁操作，提高性能。</li></ul><p><strong>6.索引实现不一样。</strong></p><ul><li>MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作为索引结构，但是两者的实现方式不太一样。</li><li>InnoDB 引擎中，其数据文件<strong>本身就是索引文件</strong>。相比 MyISAM，索引文件和数据文件是分离的，其表数据文件本身就是按 B+Tree 组织的一个索引结构，树的叶节点 data 域保存了完整的数据记录。</li></ul><h3 id="_4、myisam-和-innodb-如何选择" tabindex="-1"><a class="header-anchor" href="#_4、myisam-和-innodb-如何选择" aria-hidden="true">#</a> 4、MyISAM 和 InnoDB 如何选择？</h3><p>大多数时候我们使用的都是 InnoDB 存储引擎，在某些<strong>读密集的情况</strong>下，使用 MyISAM 也是合适的。</p><ul><li>《MySQL高性能》：不要轻易相信“MyISAM 比 InnoDB 快”之类的经验之谈，这个结论往往不是绝对的。在很多我们已知场景中，InnoDB 的速度都可以让 MyISAM 望尘莫及，尤其是用到了聚簇索引，或者需要访问的数据都可以放入内存的应用。</li></ul><p>一般情况下我们选择 InnoDB 都是没有问题的，但是某些情况下你并不在乎可扩展能力和并发能力，也不需要事务支持，也不在乎崩溃后的安全恢复问题的话，选择 MyISAM 也是一个不错的选择。但是一般情况下，我们都是需要考虑到这些问题的。</p><h2 id="_3、-mysql-查询缓存" tabindex="-1"><a class="header-anchor" href="#_3、-mysql-查询缓存" aria-hidden="true">#</a> 3、 MySQL 查询缓存</h2><p><strong>执行查询语句的时候，会先查询缓存</strong>。MySQL 8.0 版本后移除，因为这个功能不太实用。</p><p><strong>开启方式</strong>：通过配置文件或者通过sql语句来设置全局变量。</p><p><strong>过程</strong>：开启查询缓存后在同样的查询条件以及数据情况下，会直接在缓存中返回结果。</p><p><strong>查询缓存不命中的情况</strong>：</p><p>①两个查询在任何字符上的不同都会导致缓存不命中。</p><p>②如果查询中包含任何用户自定义函数、存储函数、用户变量、临时表、MySQL 库中的系统表，其查询结果也不会被缓存。</p><p>③<strong>缓存建立之后</strong>，MySQL 的查询缓存系统会跟踪查询中涉及的每张表，如果这些表（数据或结构）发生变化，那么和这张表相关的所有缓存数据都将失效。</p><h2 id="_4、mysql事务" tabindex="-1"><a class="header-anchor" href="#_4、mysql事务" aria-hidden="true">#</a> 4、MySQL事务</h2><h3 id="_1、什么是事务" tabindex="-1"><a class="header-anchor" href="#_1、什么是事务" aria-hidden="true">#</a> 1、什么是事务？</h3><p>事务是逻辑上的一组操作，<strong>要么都执行，要么都不执行</strong>。若是对单个或者多个sql语句来使用事务，那么他们就是原子性的。</p><p>例如转账案例：要么都成功，要么都失败！</p><h3 id="_2、何谓数据库事务-acid" tabindex="-1"><a class="header-anchor" href="#_2、何谓数据库事务-acid" aria-hidden="true">#</a> 2、何谓数据库事务？ACID</h3><p>大多数情况下，我们在谈论事务的时候，如果没有特指<strong>分布式事务</strong>，往往指的就是<strong>数据库事务</strong>。</p><p>简单来说，数据库事务可以保证多个对数据库的操作（也就是 SQL 语句）构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循：<strong>要么全部执行成功,要么全部不执行</strong> 。</p><div class="language-bash ext-sh line-numbers-mode"><pre class="language-bash"><code><span class="token comment"># 开启一个事务</span>
START TRANSACTION<span class="token punctuation">;</span>
<span class="token comment"># 多条 SQL 语句</span>
SQL1,SQL2<span class="token punctuation">..</span>.
<span class="token comment">## 提交事务</span>
COMMIT<span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>ACID：</p><ol><li><strong>原子性</strong>（<code>Atomicity</code>） ： 事务是最小的执行单位，不允许分割。事务的原子性确保动作<strong>要么全部完成，要么完全不起作用</strong>；</li><li><strong>一致性</strong>（<code>Consistency</code>）： <strong>执行事务前后，数据保持一致</strong>，例如转账业务中，无论事务是否成功，转账者和收款人的总额应该是不变的；</li><li><strong>隔离性</strong>（<code>Isolation</code>）： <strong>并发访问</strong>数据库时，<strong>一个用户的事务不被其他事务所干扰</strong>，各并发事务之间数据库是独立的；</li><li><strong>持久性</strong>（<code>Durabilily</code>）： 一个<strong>事务被提交之后</strong>。它对<strong>数据库中数据的改变是持久的</strong>，即使数据库发生故障也不应该对其有任何影响。</li></ol><p>只有保证了事务的持久性、原子性、隔离性之后，一致性才能得到保障。也就是说 A、I、D 是手段，C 是目的！</p><h3 id="_3、并发事务带来了哪些问题" tabindex="-1"><a class="header-anchor" href="#_3、并发事务带来了哪些问题" aria-hidden="true">#</a> 3、并发事务带来了哪些问题?</h3><p>在典型的应用程序中，多个事务并发运行，经常会操作相同的数据来完成各自的任务（多个用户对同一数据进行操作）。并发虽然是必须的，但可能会导致以下的问题：<strong>脏读、丢失修改、不可重复读、幻读</strong>。</p><ul><li>脏读（Dirty read）：当两个事务同时进行时，事务A对某个数据进行了修改，此时事务B在其修改后读取该数据读到的是事务A修改的数据，那么此时就是脏读。</li><li>丢失修改（Lost to modify）： 指在一个事务读取一个数据时，另外一个事务也访问了该数据，那么在第一个事务中修改了这个数据后，第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失，因此称为丢失修改。例如：事务 1 读取某表中的数据 A=20，事务 2 也读取 A=20，事务 1 修改 A=A-1，事务 2 也修改 A=A-1，最终结果 A=19，事务 1 的修改被丢失。</li><li>不可重复读（Unrepeatable read）：指在一个事务内多次读同一数据。在这个事务还没有结束时，另一个事务也访问该数据。那么，<strong>在第一个事务中的两次读数据之间，由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样</strong>。这就发生了在一个事务内两次读到的数据是不一样的情况，因此称为不可重复读。</li><li>幻读（Phantom read）：幻读与不可重复读类似。它发生在一个事务（T1）读取了几行数据，接着另一个并发事务（T2）插入了一些数据时。在随后的查询中，第一个事务（T1）就会发现多了一些原本不存在的记录，就好像发生了幻觉一样，所以称为幻读。</li></ul><p><strong>不可重复读和幻读区别</strong> ：不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改，幻读的重点在于新增或者删除比如多次查询同一条查询语句（DQL）时，记录发现记录增多或减少了。</p><h3 id="_4、sql-标准定义了哪些事务隔离级别" tabindex="-1"><a class="header-anchor" href="#_4、sql-标准定义了哪些事务隔离级别" aria-hidden="true">#</a> 4、SQL 标准定义了哪些事务隔离级别?</h3><p>SQL 标准定义了四个隔离级别：</p><ul><li><strong>READ-UNCOMMITTED(读取未提交)</strong> ： 最低的隔离级别，允许读取尚未提交的数据变更，可能会导致脏读、幻读或不可重复读。</li><li><strong>READ-COMMITTED(读取已提交)</strong> ： 允许读取并发事务已经提交的数据，可以阻止脏读，但是幻读或不可重复读仍有可能发生。</li><li><strong>REPEATABLE-READ(可重复读)</strong> ： 对同一字段的多次读取结果都是一致的，除非数据是被本身事务自己所修改，可以阻止脏读和不可重复读，但幻读仍有可能发生。</li><li><strong>SERIALIZABLE(可串行化)</strong> ： 最高的隔离级别，完全服从 ACID 的隔离级别。所有的事务依次逐个执行，这样事务之间就完全不可能产生干扰，也就是说，该级别可以防止脏读、不可重复读以及幻读。</li></ul><h3 id="_5、mysql-的隔离级别是基于锁实现的吗" tabindex="-1"><a class="header-anchor" href="#_5、mysql-的隔离级别是基于锁实现的吗" aria-hidden="true">#</a> 5、MySQL 的隔离级别是基于锁实现的吗？</h3><p>MySQL 的隔离级别基于<strong>锁和 MVCC 机制</strong>共同实现的。</p><p>SERIALIZABLE 隔离级别，是通过锁来实现的。除了 SERIALIZABLE 隔离级别，其他的隔离级别都是基于 MVCC 实现。</p><p>不过， SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制，就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。</p><h3 id="_6、mysql-的默认隔离级别是什么" tabindex="-1"><a class="header-anchor" href="#_6、mysql-的默认隔离级别是什么" aria-hidden="true">#</a> 6、MySQL 的默认隔离级别是什么?</h3><p>MySQL InnoDB 存储引擎的默认支持的隔离级别是 <strong>REPEATABLE-READ（可重读）</strong>。我们可以通过<code>SELECT @@tx_isolation;</code>命令来查看，MySQL 8.0 该命令改为<code>SELECT @@transaction_isolation;</code></p><h3 id="_7、解决幻读的方法" tabindex="-1"><a class="header-anchor" href="#_7、解决幻读的方法" aria-hidden="true">#</a> 7、解决幻读的方法</h3><p>解决幻读的方式有很多，但是它们的核心思想就是一个事务在操作某张表数据的时候，另外一个事务不允许新增或者删除这张表中的数据了。解决幻读的方式主要有以下几种：</p><ol><li>将事务隔离级别调整为 <code>SERIALIZABLE</code></li><li>在可重复读的事务级别下，给事务操作的这张表添加<strong>表锁</strong></li><li>在可重复读的事务级别下，给事务操作的这张表添加 <code>Next-Key Locks</code></li></ol><p>实际上很多的项目中是不会使用到上面的两种方法的，串行化读的性能太差，而且其实幻读很多时候是我们完全可以接受的。</p><h2 id="_5、mysql-锁" tabindex="-1"><a class="header-anchor" href="#_5、mysql-锁" aria-hidden="true">#</a> 5、MySQL 锁</h2><h3 id="_1、表级锁和行级锁了解吗-有什么区别" tabindex="-1"><a class="header-anchor" href="#_1、表级锁和行级锁了解吗-有什么区别" aria-hidden="true">#</a> 1、表级锁和行级锁了解吗？有什么区别？</h3><p>MyISAM 仅仅支持表级锁(table-level locking)，一锁就锁整张表，这在并发写的情况下性非常差。</p><p>InnoDB 不光支持表级锁(table-level locking)，还支持行级锁(row-level locking)，默认为行级锁。行级锁的粒度更小，仅对相关的记录上锁即可（对一行或者多行记录加锁），所以对于并发写入操作来说， InnoDB 的性能更高。</p><p>对比：</p><ul><li>表级锁：直接对操作的表进行加锁，上锁快，并发度低，不会出现死锁情况。</li><li>行级锁：针对索引字段加的锁，只针对当前操作的记录进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小，并发度高，但加锁的开销也最大，加锁慢，会出现死锁。</li></ul><h3 id="_2、行级锁的使用有什么注意事项" tabindex="-1"><a class="header-anchor" href="#_2、行级锁的使用有什么注意事项" aria-hidden="true">#</a> 2、行级锁的使用有什么注意事项？</h3><p>InnoDB 的<strong>行锁是针对索引字段加的锁</strong>，表级锁是针对非索引字段加的锁。当我们执行 <code>UPDATE</code>、<code>DELETE</code> 语句时，如果 <code>WHERE</code>条件中字段没有命中索引或者索引失效的话，就会导致扫描全表对表中的所有记录进行加锁。这个在我们日常工作开发中经常会遇到，一定要多多注意！！！</p><p>不过，很多时候即使用了索引也有可能会走全表扫描，这是因为 MySQL 优化器的原因。</p><h3 id="_3、共享锁和排他锁呢" tabindex="-1"><a class="header-anchor" href="#_3、共享锁和排他锁呢" aria-hidden="true">#</a> 3、共享锁和排他锁呢？</h3><p>不论是表级锁还是行级锁，都存在共享锁（Share Lock，S 锁）和排他锁（Exclusive Lock，X 锁）这两类：</p><ul><li><strong>共享锁（S 锁）</strong> ：又称读锁，事务在读取记录的时候获取共享锁，允许多个事务同时获取（锁兼容）。</li><li><strong>排他锁（X 锁）</strong> ：又称写锁/独占锁，事务在修改记录的时候获取排他锁，不允许多个事务同时获取。如果一个记录已经被加了排他锁，那其他事务不能再对这条事务加任何类型的锁（锁不兼容）。</li></ul><p>排他锁与任何的锁都不兼容，共享锁仅和共享锁兼容。</p><table><thead><tr><th style="text-align:left;"></th><th style="text-align:left;">S 锁</th><th>X 锁</th></tr></thead><tbody><tr><td style="text-align:left;">S 锁</td><td style="text-align:left;">不冲突</td><td>冲突</td></tr><tr><td style="text-align:left;">X 锁</td><td style="text-align:left;">冲突</td><td>冲突</td></tr></tbody></table><p>由于 MVCC 的存在，对于一般的 <code>SELECT</code> 语句，InnoDB 不会加任何锁。不过， 你可以通过以下语句显式加共享锁或排他锁。</p><h3 id="_4、意向锁有什么作用" tabindex="-1"><a class="header-anchor" href="#_4、意向锁有什么作用" aria-hidden="true">#</a> 4、意向锁有什么作用？</h3><p>如果需要用到表锁的话，如何判断表中的记录没有行锁呢？一行一行遍历肯定是不行，性能太差。我们需要用到一个叫做<strong>意向锁的东东来快速判断是否可以对某个表使用表锁</strong>。</p><p><strong>意向锁是表级锁</strong>，共有两种：</p><ul><li><strong>意向共享锁（Intention Shared Lock，IS 锁）</strong>：事务有意向对表中的某些记录加共享锁（S 锁），加共享锁前必须先取得该表的 IS 锁。</li><li><strong>意向排他锁（Intention Exclusive Lock，IX 锁）</strong>：事务有意向对表中的某些记录加排他锁（X 锁），加排他锁之前必须先取得该表的 IX 锁。</li></ul><p>意向锁是有数据引擎自己维护的，用户无法手动操作意向锁，在为数据行加共享 / 排他锁之前，InooDB 会先获取该数据行所在在数据表的对应意向锁。</p><p>意向锁之间是互相兼容的。</p><table><thead><tr><th></th><th>IS 锁</th><th>IX 锁</th></tr></thead><tbody><tr><td>IS 锁</td><td>兼容</td><td>兼容</td></tr><tr><td>IX 锁</td><td>兼容</td><td>兼容</td></tr></tbody></table><p>意向锁和共享锁和排它锁互斥（这里指的是表级别的共享锁和排他锁，意向锁不会与行级的共享锁和排他锁互斥）。</p><table><thead><tr><th></th><th>IS 锁</th><th>IX 锁</th></tr></thead><tbody><tr><td>S 锁</td><td>兼容</td><td>互斥</td></tr><tr><td>X 锁</td><td>互斥</td><td>互斥</td></tr></tbody></table><h3 id="_5、innodb-有哪几类行锁" tabindex="-1"><a class="header-anchor" href="#_5、innodb-有哪几类行锁" aria-hidden="true">#</a> 5、InnoDB 有哪几类行锁？</h3><p>MySQL InnoDB 支持三种行锁定方式：</p><ul><li><strong>记录锁（Record Lock）</strong> ：也被称为记录锁，属于单个行记录上的锁。</li><li><strong>间隙锁（Gap Lock）</strong> ：锁定一个范围，不包括记录本身。</li><li><strong>临键锁（Next-key Lock）</strong> ：Record Lock+Gap Lock，锁定一个范围，包含记录本身。记录锁只能锁住已经存在的记录，为了避免插入新记录，需要依赖间隙锁。</li></ul><p>InnoDB 的默认隔离级别 REPEATABLE-READ（可重读）是可以解决幻读问题发生的，主要有下面两种情况：</p><ul><li><strong>快照读</strong> ：由 MVCC 机制来保证不出现幻读。</li><li><strong>当前读</strong> ： 使用 Next-Key Lock 进行加锁来保证不出现幻读。</li></ul><h2 id="_6、索引" tabindex="-1"><a class="header-anchor" href="#_6、索引" aria-hidden="true">#</a> 6、索引</h2><h3 id="_1、索引规范" tabindex="-1"><a class="header-anchor" href="#_1、索引规范" aria-hidden="true">#</a> 1、索引规范</h3><p>1、限制每张表上的索引数量,建议单张表索引不超过 5 个：索引并不是越多越好！索引可以提高效率同样可以降低效率。</p><p>2、禁止给表中的每一列都建立单独的索引：5.6 版本之前，一个 sql 只能使用到一个表中的一个索引，5.6 以后，虽然有了合并索引的优化方式，但是还是远远没有使用一个联合索引的查询方式好。</p><p>3、每个 Innodb 表<strong>必须有个主键</strong>：数据的存储的逻辑顺序和索引的顺序是相同的。每个表都可以有多个索引，但是表的存储顺序只能有一种。</p><p>Innodb 是按照<strong>主键索引</strong>的顺序来组织表的</p><ul><li>不要使用更新频繁的列作为主键，不适用多列主键（相当于联合索引）</li><li>不要使用 UUID,MD5,HASH,字符串列作为主键（无法保证数据的顺序增长）</li><li>主键建议使用自增 ID 值</li></ul><p>4、常见索引列建议</p><ul><li>出现在 SELECT、UPDATE、DELETE 语句的 WHERE 从句中的列</li><li>包含在 ORDER BY、GROUP BY、DISTINCT 中的字段</li><li>并不要将符合 1 和 2 中的字段的列都建立一个索引， 通常将 1、2 中的字段建立联合索引效果更好</li><li>多表 join 的关联列</li></ul><p>5、如何选择索引列的顺序</p><p>建立索引的目的是：希望通过索引进行数据查找，减少随机 IO，增加查询性能 ，索引能过滤出越少的数据，则从磁盘中读入的数据也就越少。</p><ul><li>区分度最高的放在联合索引的最左侧（区分度=列中不同值的数量/列的总行数）</li><li>尽量把字段长度小的列放在联合索引的最左侧（因为字段长度越小，一页能存储的数据量越大，IO 性能也就越好）</li><li>使用最频繁的列放到联合索引的左侧（这样可以比较少的建立一些索引）</li></ul><p>6、避免建立冗余索引和重复索引（增加了查询优化器生成执行计划的时间）</p><ul><li>重复索引示例：primary key(id)、index(id)、unique index(id)</li><li>冗余索引示例：index(a,b,c)、index(a,b)、index(a)</li></ul><p>7、对于频繁的查询优先考虑使用<strong>覆盖索引</strong>：<a href="https://blog.csdn.net/fofcn/article/details/123101046" target="_blank" rel="noopener noreferrer">MySQL 覆盖索引（Cover Index）<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a>、<a href="https://www.bilibili.com/video/BV1cv411P7Wb?spm_id_from=333.337.search-card.all.click&amp;vd_source=b19269a4ae00481d5ff13d1897127b8b" target="_blank" rel="noopener noreferrer">视频—3. 覆盖索引(联合索引)优化回表查询、最左前缀原则原理<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></p><p>覆盖索引：就是包含了所有查询字段 (where,select,order by,group by 包含的字段) 的索引。</p><p><strong>覆盖索引的好处：</strong></p><ul><li><strong>避免 Innodb 表进行索引的二次查询:</strong> Innodb 是以聚集索引的顺序来存储的，对于 Innodb 来说，二级索引在叶子节点中所保存的是行的主键信息，如果是用二级索引查询数据的话，在查找到相应的键值后，还要通过主键进行二次查询才能获取我们真实所需要的数据。而在覆盖索引中，二级索引的键值中可以获取所有的数据，避免了对主键的二次查询 ，减少了 IO 操作，提升了查询效率。</li><li><strong>可以把随机 IO 变成顺序 IO 加快查询效率:</strong> 由于覆盖索引是按键值的顺序存储的，对于 IO 密集型的范围查找来说，对比随机从磁盘读取每一行的数据 IO 要少的多，因此利用覆盖索引在访问时也可以把磁盘的随机读取的 IO 转变成索引查找的顺序 IO。</li></ul><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>索引失效一般指的是联合索引
建立单个索引，在进行查询时可能会出现回表查，若是建立了覆盖索引的话，那么就查一次就ok了。
最左匹配原则。
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="_2、索引详解" tabindex="-1"><a class="header-anchor" href="#_2、索引详解" aria-hidden="true">#</a> 2、索引详解</h3><h4 id="_1、何为索引-有什么作用" tabindex="-1"><a class="header-anchor" href="#_1、何为索引-有什么作用" aria-hidden="true">#</a> 1、何为索引？有什么作用？</h4><p><strong>索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树， B+树和 Hash。</strong></p><h4 id="_2、索引的优缺点" tabindex="-1"><a class="header-anchor" href="#_2、索引的优缺点" aria-hidden="true">#</a> 2、索引的优缺点</h4><p><strong>优点</strong> ：</p><ul><li>使用索引可以大大加快 数据的检索速度（大大减少检索的数据量）, 这也是创建索引的最主要的原因。</li><li>通过创建唯一性索引，可以保证数据库表中每一行数据的唯一性。</li></ul><p><strong>缺点</strong> ：</p><ul><li>创建索引和维护索引需要耗费许多时间。当对表中的数据进行增删改的时候，如果数据有索引，那么索引也需要动态的修改，会降低 SQL 执行效率。</li><li>索引需要使用物理文件存储，也会耗费一定空间。</li></ul><p>大多数情况下，索引查询都是比全表扫描要快的。但是如果数据库的数据量不大，那么使用索引也不一定能够带来很大提升。</p><h4 id="_3、索引的底层数据结构" tabindex="-1"><a class="header-anchor" href="#_3、索引的底层数据结构" aria-hidden="true">#</a> 3、索引的底层数据结构</h4><p>Hash表：其最大的缺点就是不支持顺序和范围查询。</p><p>B 树&amp; B+树：多路平衡查找树</p><ul><li>MyISAM 引擎中，B+Tree <strong>叶节点的 data 域存放的是数据记录的地址</strong>。在索引检索的时候，首先按照 B+Tree 搜索算法搜索索引，如果指定的 Key 存在，则取出其 data 域的值，然后以 data 域的值为地址读取相应的数据记录。这被称为“非聚簇索引”。</li><li>InnoDB 引擎中，<strong>其数据文件本身就是索引文件</strong>。相比 MyISAM，索引文件和数据文件是分离的，其表数据文件本身就是按 B+Tree 组织的一个索引结构，树的叶节点 data 域保存了完整的数据记录。这个索引的 key 是数据表的主键，因此 InnoDB 表数据文件本身就是主索引。这被称为“聚簇索引（或聚集索引）”，而其余的索引都作为辅助索引，辅助索引的 data 域存储相应记录主键的值而不是地址，这也是和 MyISAM 不同的地方。在根据主索引搜索时，直接找到 key 所在的节点即可取出数据；在根据辅助索引查找时，则需要先取出主键的值，再走一遍主索引。 因此，在设计表的时候，不建议使用过长的字段作为主键，也不建议使用非单调的字段作为主键，这样会造成主索引频繁分裂。</li></ul><h4 id="_4、索引的类型" tabindex="-1"><a class="header-anchor" href="#_4、索引的类型" aria-hidden="true">#</a> 4、索引的类型</h4><blockquote><p>主键索引(Primary Key)</p></blockquote><p>数据表的主键列使用的就是主键索引。</p><p>一张数据表有只能有一个主键，并且主键不能为 null，不能重复。</p><p>在 MySQL 的 InnoDB 的表中，<strong>当没有显示的指定表的主键时</strong>，InnoDB 会<strong>自动先检查表中是否有唯一索引且不允许存在null值的字段</strong>，如果有，则选择该字段为默认的主键，否则 InnoDB 将会自动创建一个 <strong>6Byte 的自增主键</strong>。</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161549804.png" alt="image-20220616154930739" loading="lazy"></p><blockquote><p>二级索引(辅助索引)</p></blockquote><p>二级索引又称为辅助索引，是因为<strong>二级索引的叶子节点存储的数据是主键</strong>。也就是说，通过二级索引，可以定位主键的位置。</p><p>唯一索引，普通索引，前缀索引等索引属于二级索引。</p><ol><li><strong>唯一索引(Unique Key)</strong> ：唯一索引也是一种约束。<strong>唯一索引的属性列不能出现重复的数据，但是允许数据为 NULL，一张表允许创建多个唯一索引。</strong> 建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性，而不是为了查询效率。</li><li><strong>普通索引(Index)</strong> ：<strong>普通索引的唯一作用就是为了快速查询数据，一张表允许创建多个普通索引，并允许数据重复和 NULL。</strong></li><li><strong>前缀索引(Prefix)</strong> ：前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引，相比普通索引建立的数据更小， 因为只取前几个字符。</li><li><strong>全文索引(Full Text)</strong> ：全文索引主要是为了检索大文本数据中的关键字的信息，是目前搜索引擎数据库使用的一种技术。Mysql5.6 之前只有 MYISAM 引擎支持全文索引，5.6 之后 InnoDB 也支持了全文索引。</li></ol><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161552572.png" alt="image-20220616155234505" loading="lazy"></p><h4 id="_5、聚集索引与非聚集索引" tabindex="-1"><a class="header-anchor" href="#_5、聚集索引与非聚集索引" aria-hidden="true">#</a> 5、聚集索引与非聚集索引</h4><p>聚集索引即索引结构和数据一起存放的索引：主键索引属于聚集索引。</p><p>非聚集索引即索引结构和数据分开存放的索引：二级索引属于非聚集索引。</p><ul><li><p>优点：<strong>更新代价比聚集索引要小</strong> 。非聚集索引的更新代价就没有聚集索引那么大了，非聚集索引的叶子节点是不存放数据的。</p></li><li><p>缺点：①跟聚集索引一样，非聚集索引也<strong>依赖于有序的数据</strong>。②<strong>可能会二次查询</strong>(回表) :这应该是非聚集索引最大的缺点了。 当查到索引对应的指针或主键后，可能还需要根据指针或主键再到数据文件或表中查询。</p></li></ul><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161604243.png" alt="image-20220616160419201" loading="lazy"></p><h4 id="_6、非聚集索引一定回表查询吗-覆盖索引" tabindex="-1"><a class="header-anchor" href="#_6、非聚集索引一定回表查询吗-覆盖索引" aria-hidden="true">#</a> 6、非聚集索引一定回表查询吗(覆盖索引)?</h4><p>非聚集索引不一定回表查询。</p><p>无论是MyISAM还是Inndb，若是建立的索引key就是你进行select查询的字段名，那么就不会产生回表查询，例如：</p><div class="language-sql ext-sql line-numbers-mode"><pre class="language-sql"><code><span class="token keyword">SELECT</span> name <span class="token keyword">FROM</span> <span class="token keyword">table</span> <span class="token keyword">WHERE</span> name<span class="token operator">=</span><span class="token string">&#39;guang19&#39;</span><span class="token punctuation">;</span>
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div></div></div><h4 id="_7、覆盖索引" tabindex="-1"><a class="header-anchor" href="#_7、覆盖索引" aria-hidden="true">#</a> 7、覆盖索引</h4><p>如果一个索引包含（或者说覆盖）所有需要查询的字段的值，我们就称之为“覆盖索引”。</p><p>覆盖索引即需要查询的字段正好是索引的字段，那么直接根据该索引，就可以查到数据了，而无需回表查询。</p><h4 id="_8、联合索引" tabindex="-1"><a class="header-anchor" href="#_8、联合索引" aria-hidden="true">#</a> 8、联合索引</h4><p>使用表中的多个字段创建索引，就是 <strong>联合索引</strong>，也叫 <strong>组合索引</strong> 或 <strong>复合索引</strong>。</p><h4 id="_9、最左前缀匹配原则" tabindex="-1"><a class="header-anchor" href="#_9、最左前缀匹配原则" aria-hidden="true">#</a> 9、最左前缀匹配原则</h4><p>原则：在使用联合索引时，<strong>MySQL</strong> 会根据联合索引中的字段顺序，从左到右依次到查询条件中去匹配，如果查询条件中存在与联合索引中最左侧字段相匹配的字段，则就会使用该字段过滤一批数据，直至联合索引中全部字段匹配完成，或者在执行过程中遇到范围查询，如 <strong><code>&gt;</code></strong>、<strong><code>&lt;</code></strong>、<strong><code>between</code></strong> 和 <strong><code>以%开头的like查询</code></strong> 等条件，才会停止匹配。</p><p>建议：在使用联合索引时，可以<strong>将区分度高的字段放在最左边</strong>，这也可以过滤更多数据。</p><h4 id="_10、索引下推" tabindex="-1"><a class="header-anchor" href="#_10、索引下推" aria-hidden="true">#</a> 10、索引下推</h4><p>索引下推是 <strong>MySQL 5.6</strong> 版本中提供的一项索引优化功能，可以在<strong>非聚簇索引遍历过程中</strong>，对索引中包含的字段先做判断，过滤掉不符合条件的记录，减少回表次数。</p><h4 id="_11、创建索引的注意事项" tabindex="-1"><a class="header-anchor" href="#_11、创建索引的注意事项" aria-hidden="true">#</a> 11、创建索引的注意事项</h4><p>1、选择合适的字段创建索引：①不为 NULL 的字段。②被频繁查询的字段。③被作为条件查询的字段 。④频繁需要排序的字段。⑤被经常频繁用于连接的字段。</p><p>2、被频繁更新的字段应该慎重建立索引</p><p>3、尽可能的考虑建立联合索引而不是单列索引</p><p>4、注意避免冗余索引</p><p>5、考虑在字符串类型的字段上使用前缀索引代替普通索引</p><h4 id="_12、mysql添加表字段索引" tabindex="-1"><a class="header-anchor" href="#_12、mysql添加表字段索引" aria-hidden="true">#</a> 12、MySQL添加表字段索引</h4><p>主键索引：PRIMARY KEY</p><p>唯一索引：UNIQUE</p><p>普通索引：INDEX</p><p>全文索引：FULLTEXT</p><p>多列索引：INDEX</p><h2 id="_7、mysql三大日志" tabindex="-1"><a class="header-anchor" href="#_7、mysql三大日志" aria-hidden="true">#</a> 7、MySQL三大日志</h2><p><code>MySQL</code> 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。</p><p>比较重要的还要属二进制日志 <code>binlog</code>（归档日志）和事务日志 <code>redo log</code>（重做日志）和 <code>undo log</code>（回滚日志）。</p><p><code>redo log</code>（重做日志）、<code>binlog</code>（归档日志）、两阶段提交、<code>undo log</code> （回滚日志）。</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161626401.png" alt="image-20220616162638337" loading="lazy"></p><h3 id="redo-log" tabindex="-1"><a class="header-anchor" href="#redo-log" aria-hidden="true">#</a> redo log</h3><p><code>redo log</code>（重做日志）是<code>InnoDB</code>存储引擎独有的，它让<code>MySQL</code>拥有了崩溃恢复能力。</p><p>重点：<code>redo log</code> 它是物理日志，记录内容是“在某个数据页上做了什么修改”，属于 <code>InnoDB</code> 存储引擎。</p><h3 id="binlog" tabindex="-1"><a class="header-anchor" href="#binlog" aria-hidden="true">#</a> binlog</h3><p><code>binlog</code> 是逻辑日志，记录内容是语句的原始逻辑，类似于“给 ID=2 这一行的 c 字段加 1”，属于<code>MySQL Server</code> 层。</p><p>不管用什么存储引擎，只要发生了表数据更新，都会产生 <code>binlog</code> 日志</p><p>目的：<code>MySQL</code>数据库的<strong>数据备份、主备、主主、主从</strong>都离不开<code>binlog</code>，需要依靠<code>binlog</code>来同步数据，<strong>保证数据一致性</strong>。</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161638188.png" alt="image-20220616163833133" loading="lazy"></p><p><code>binlog</code>会记录所有涉及更新数据的逻辑操作，并且是顺序写。</p><p><strong>写入内容格式（记录格式）</strong>：statement（sql原文）、row（具体的数据，例如时间戳...）、mixed（记录的内容是前两者的混合）</p><ul><li><code>MySQL</code>会判断这条<code>SQL</code>语句是否可能引起数据不一致，如果是，就用<code>row</code>格式，否则就用<code>statement</code>格式。</li></ul><p><strong>写入机制</strong>：<code>binlog</code>的写入时机也非常简单，事务执行过程中，先把日志写到<code>binlog cache</code>，事务提交的时候，再把<code>binlog cache</code>写到<code>binlog</code>文件中。</p><ul><li>因为一个事务的<code>binlog</code>不能被拆开，无论这个事务多大，也要确保一次性写入，所以系统会给每个线程分配一个块内存作为<code>binlog cache</code>。</li><li>我们可以通过<code>binlog_cache_size</code>参数控制单个线程 binlog cache 大小，如果存储内容超过了这个参数，就要暂存到磁盘（<code>Swap</code>）。</li></ul><p>设置sync_binlog不同参数：</p><ul><li>0为表示每次提交事务都只<code>write</code>，由系统自行判断什么时候执行<code>fsync</code>。</li><li>1为表示每次提交事务都会执行<code>fsync</code>，就如同 <strong>redo log 日志刷盘流程</strong> 一样。</li><li><code>N(N&gt;1)</code>，表示每次提交事务都<code>write</code>，但累积<code>N</code>个事务后才<code>fsync</code>。</li></ul><h3 id="二阶段提交" tabindex="-1"><a class="header-anchor" href="#二阶段提交" aria-hidden="true">#</a> 二阶段提交</h3><p><code>redo log</code>（重做日志）让<code>InnoDB</code>存储引擎拥有了<strong>崩溃恢复能力</strong>。</p><p><code>binlog</code>（归档日志）保证了<code>MySQL</code>集群架构的<strong>数据一致性</strong>。</p><p>执行更新语句过程，会记录<code>redo log</code>与<code>binlog</code>两块日志，以基本的事务为单位，<code>redo log</code>在事务执行过程中可以不断写入，而<code>binlog</code>只有在提交事务时才写入，所以<code>redo log</code>与<code>binlog</code>的写入时机不一样。</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161648951.png" alt="image-20220616164844786" loading="lazy"></p><p><strong>场景一</strong>：假设执行过程中写完<code>redo log</code>日志后，<code>binlog</code>日志写期间发生了异常，会出现什么情况呢？</p><p><strong>问题描述</strong>：由于<code>binlog</code>没写完就异常，这时候<code>binlog</code>里面没有对应的修改记录。因此，之后用<code>binlog</code>日志恢复数据时，就会少这一次更新，恢复出来的这一行<code>c</code>值是<code>0</code>，而原库因为<code>redo log</code>日志恢复，这一行<code>c</code>值是<code>1</code>，最终数据不一致。</p><p><strong>解决方案</strong>：<code>InnoDB</code>存储引擎使用<strong>两阶段提交</strong>方案。</p><ul><li>原理很简单，将<code>redo log</code>的写入拆成了两个步骤<code>prepare</code>和<code>commit</code>，这就是<strong>两阶段提交</strong>。</li><li>使用<strong>两阶段提交</strong>后，写入<code>binlog</code>时发生异常也不会有影响，因为<code>MySQL</code>根据<code>redo log</code>日志恢复数据时，发现<code>redo log</code>还处于<code>prepare</code>阶段，并且没有对应<code>binlog</code>日志，就会回滚该事务。</li></ul><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161650500.png" alt="image-20220616165015332" loading="lazy"></p><p><strong>场景二</strong>：<code>redo log</code>设置<code>commit</code>阶段发生异常，那会不会回滚事务呢？</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161652084.png" alt="image-20220616165210956" loading="lazy"></p><ul><li>首先进行commit阶段判断，若不是再去判断是否有对应的binlog，若是有就会提交事务恢复数据，没有就回滚事务。</li></ul><p>并不会回滚事务，它会执行上图框住的逻辑，虽然<code>redo log</code>是处于<code>prepare</code>阶段，但是能通过事务<code>id</code>找到对应的<code>binlog</code>日志，所以<code>MySQL</code>认为是完整的，就会提交事务恢复数据。</p><h3 id="undo-log" tabindex="-1"><a class="header-anchor" href="#undo-log" aria-hidden="true">#</a> undo log</h3><p><strong>说明</strong>：如果想要保证事务的原子性，就需要在异常发生时，对已经执行的操作进行<strong>回滚</strong>，恢复机制是通过 <strong>回滚日志（undo log）</strong> 实现的，所有事务进行的修改都会先记录到这个回滚日志中，然后再执行相关的操作。如果执行过程中遇到异常的话，我们直接利用 <strong>回滚日志</strong> 中的信息将数据回滚到修改之前的样子即可！并且，回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况，当用户再次启动数据库的时候，数据库还能够通过查询回滚日志来回滚将之前未完成的事务。</p><p><code>MVCC</code> 的实现依赖于：<strong>隐藏字段、Read View、undo log</strong>。在内部实现中，<code>InnoDB</code> 通过数据行的 <code>DB_TRX_ID</code> 和 <code>Read View</code> 来判断数据的可见性，如不可见，则通过数据行的 <code>DB_ROLL_PTR</code> 找到 <code>undo log</code> 中的历史版本。每个事务读到的数据版本可能是不一样的，在同一个事务中，用户只能看到该事务创建 <code>Read View</code> 之前已经提交的修改和该事务本身做的修改。</p><h3 id="总结" tabindex="-1"><a class="header-anchor" href="#总结" aria-hidden="true">#</a> 总结</h3><p>MySQL InnoDB 引擎使用 <strong>redo log(重做日志)</strong> 保证事务的<strong>持久性</strong>，使用 <strong>undo log(回滚日志)</strong> 来保证事务的<strong>原子性</strong>。</p><p><code>MySQL</code>数据库的<strong>数据备份、主备、主主、主从</strong>都离不开<code>binlog</code>，需要依靠<code>binlog</code>来同步数据，保证数据一致性。</p><h2 id="_8、innodb存储引擎对mvcc的实现" tabindex="-1"><a class="header-anchor" href="#_8、innodb存储引擎对mvcc的实现" aria-hidden="true">#</a> 8、InnoDB存储引擎对MVCC的实现</h2><h3 id="请你说说innodb的mvcc" tabindex="-1"><a class="header-anchor" href="#请你说说innodb的mvcc" aria-hidden="true">#</a> <strong>请你说说InnoDB的MVCC</strong></h3><blockquote><p>来自：<a href="https://www.nowcoder.com/exam/interview/detail?questionClassifyId=0&amp;questionId=2412880&amp;questionJobId=160&amp;type=1" target="_blank" rel="noopener noreferrer">牛客-请你说说InnoDB的MVCC<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span></a></p></blockquote><p>得分点 无锁并发</p><p>全称 Multi-Version Concurrency Control ,即多版本并发控制,逻辑是<strong>维持一个数据的多个版本</strong>,使得读写操作没有冲突。</p><p>MVCC主要是为了<strong>提高数据库并发性能</strong>,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。</p><p>它是一种用来解决读-写冲突的无锁并发控制机制。在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能,还可以解决脏读、幻读、不可重复读等事务隔离问题,但不能解决更新丢失问题。</p><p>加分回答 <strong>InnoDB默认的隔离级别是RR（REPEATABLE READ）,RR解决脏读、不可重复读、幻读等问题,使用的是MVCC</strong></p><p>MVCC全称Multi-Version Concurrency Control,即多版本的并发控制协议。它最大的优点是读不加锁,因此读写不冲突,并发性能好。</p><p>InnoDB实现MVCC,多个版本的数据可以共存,主要基于以下技术及数据结构：</p><ol><li>隐藏列：InnoDB中每行数据都有隐藏列,隐藏列中包含了本行数据的事务id、指向undo log的指针等。</li><li>基于undo log的版本链：每行数据的隐藏列中包含了指向undo log的指针,而每条undo log也会指向更早版本的undo log,从而形成一条版本链。</li><li>ReadView：通过隐藏列和版本链,MySQL可以将数据恢复到指定版本。但是具体要恢复到哪个版本,则需要根据ReadView来确定。所谓ReadView,是指事务（记做事务A）在某一时刻给整个事务系统（trx_sys）打快照,之后再进行读操作时,会将读取到的数据中的事务id与trx_sys快照比较，从而判断数据对该ReadView是否可见,即对事务A是否可见。</li></ol><h3 id="_1、一致性非锁定都与锁定读" tabindex="-1"><a class="header-anchor" href="#_1、一致性非锁定都与锁定读" aria-hidden="true">#</a> 1、一致性非锁定都与锁定读</h3><p><code>MVCC</code>：一致性非锁定读。</p><p><code>Next-key Lock</code>：锁定读。</p><h3 id="_2、innodb-对-mvcc-的实现原理以及readview介绍" tabindex="-1"><a class="header-anchor" href="#_2、innodb-对-mvcc-的实现原理以及readview介绍" aria-hidden="true">#</a> 2、InnoDB 对 MVCC 的实现原理以及ReadView介绍</h3><p><code>MVCC</code>( Multiversion concurrency control ) 就是同一份数据保留多版本的一种方式，进而实现并发控制。在查询的时候，通过read view和版本链找到对应版本的数据。</p><p><code>MVCC</code> 的实现依赖于：<strong>隐藏字段、Read View、undo log</strong>。</p><ul><li>在内部实现中，<code>InnoDB</code> 通过数据行的 <code>DB_TRX_ID</code> 和 <code>Read View</code> 来判断数据的可见性，如不可见，则通过数据行的 <code>DB_ROLL_PTR</code> 找到 <code>undo log</code> 中的历史版本。</li><li>每个事务读到的数据版本可能是不一样的，在同一个事务中，用户只能看到该事务创建 <code>Read View</code> 之前已经提交的修改和该事务本身做的修改。</li></ul><p><strong>核心</strong>：读到的数据与在事务创建时创建的read view相关。</p><p><strong>作用</strong>：提升并发性能。对于高并发场景，MVCC比行级锁更有效、开销更小。</p><blockquote><p>MVCC的实现原理</p></blockquote><p>MVCC 的实现依赖于版本链，版本链是通过表的三个隐藏字段实现</p><ul><li>DB_TRX_ID ：当前事务id，通过事务id的大小判断事务的时间顺序。</li><li>DB_ROLL_PRT ：回滚指针，指向当前行记录的上一个版本，通过这个指针将数据的多个版本连接在一起构成undo log版本链。</li><li>DB_ROLL_ID ：主键，如果数据表没有主键，InnoDB会自动生成主键。</li></ul><p>每条表记录大概是这样的：</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206261639064.png" alt="image-20220626163943996" loading="lazy"></p><p>使用事务更新行记录的时候，就会生成版本链，执行过程如下：</p><ol><li><p>用排他锁锁住该行；</p></li><li><p>将该行原本的值拷贝到 undo log，作为旧版本用于回滚；</p></li><li><p>修改当前行的值，生成一个新版本，更新事务id，使回滚指针指向旧版本的记录，这样就形成一条版本链。</p></li></ol><p>下面举个例子方便大家理解：</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206261640446.png" alt="image-20220626164046309" loading="lazy"></p><blockquote><p>READ VIEW</p></blockquote><p>Read View 可以理解成对数据在每个时刻的状态拍成“照片”记录下来。这样获取某时刻的数据时就还是原来的”照片“上的数据，是不会变的。</p><p>在 read view 内部维护一个活跃事务链表，表示生成 read view 的时候还在活跃的事务。</p><ul><li>这个链表包含<strong>在创建 read view 之前还未提交的事务，不包含创建 read view 之后提交的事务</strong>。</li></ul><p><strong>不同隔离级别创建read view的时机</strong>：</p><ul><li>read committed：<strong>每次执行select都会创建新的read_view</strong>，保证能读取到其他事务已经提交的修改。</li><li>repeatable read：<strong>在一个事务范围内，第一次select时更新这个read_view，以后不会再更新，后续所有的select都是复用之前的read_view</strong>。这样可以保证事务范围内每次读取的内容都一样，即可重复读。</li></ul><p><strong>Read view的记录筛选方式</strong>：</p><p>前提： DATA_TRX_ID 表示每个数据行的最新的事务ID； up_limit_id 表示当前快照中的最先开始的事务； low_limit_id 表示当前快照中的最慢开始的事务，即最后一个事务。</p><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206261644197.png" alt="image-20220626164459141" loading="lazy"></p><ul><li>如果 DATA_TRX_ID &lt; up_limit_id ：说明在创建 read view 时，修改该数据行的事务已提交，该版本的记录可被当前事务读取到。</li><li>如果 DATA_TRX_ID &gt;= low_limit_id ：说明当前版本的记录的事务是在创建 read view 之后生成的，该版本的数据行不可以被当前事务访问。此时需要通过版本链找到上一个版本，然后重新判断该版本的记录对当前事务的可见性。</li><li>如果 up_limit_id &lt;= DATA_TRX_ID &lt; low_limit_i ： <ul><li>1、需要在活跃事务链表中查找是否存在ID为 DATA_TRX_ID 的值的事务。</li><li>2、如果存在，因为在活跃事务链表中的事务是未提交的，所以该记录是不可见的。此时需要通过版本链找到上一个版本，然后重新判断该版本的可见性。</li><li>3、如果不存在，说明事务trx_id 已经提交了，这行记录是可见的。</li></ul></li></ul><p>**总结：**InnoDB 的 MVCC 是通过 read view 和版本链实现的，版本链保存有历史版本记录，通过 readview 判断当前版本的数据是否可见，如果不可见，再从版本链中找到上一个版本，继续进行判断，直到找到一个可见的版本。</p><h3 id="_3、快照读与当前读" tabindex="-1"><a class="header-anchor" href="#_3、快照读与当前读" aria-hidden="true">#</a> 3、快照读与当前读</h3><p>表记录有两种读取方式。</p><ul><li>快照读：读取的是快照版本。普通的SELECT就是快照读。通过MVCC来进行并发控制的，不用加锁。</li><li>当前读：读取的是最新版本。 UPDATE、DELETE、INSERT、SELECT … LOCK IN SHARE MODE、SELECT … FOR UPDATE 是当前读。</li></ul><p><strong>那么MySQL如何实现避免幻读</strong>？</p><ul><li>在快照读情况下，MySQL通过mvcc来避免幻读。</li><li>在当前读情况下，MySQL通过next-key来避免幻读（加行锁和间隙锁来实现的）。</li></ul><p><strong>next-key包括两部分</strong>：行锁和间隙锁。行锁是加在索引上的锁，间隙锁是加在索引之间的。</p><p><code>Serializable</code>隔离级别也可以避免幻读，会锁住整张表，并发性极低，一般不会使用。</p><h3 id="_4、rc-和-rr-隔离级别下-mvcc-的差异" tabindex="-1"><a class="header-anchor" href="#_4、rc-和-rr-隔离级别下-mvcc-的差异" aria-hidden="true">#</a> 4、RC 和 RR 隔离级别下 MVCC 的差异</h3><p>在事务隔离级别 <code>RC</code> 和 <code>RR</code> （InnoDB 存储引擎的默认事务隔离级别）下，<code>InnoDB</code> 存储引擎使用 <code>MVCC</code>（非锁定一致性读），但它们生成 <code>Read View</code> 的时机却不同</p><ul><li>在 RC 隔离级别下的 <strong><code>每次select</code></strong> 查询前都生成一个<code>Read View</code> (m_ids 列表)</li><li>在 RR 隔离级别下只在事务开始后 <strong><code>第一次select</code></strong> 数据前生成一个<code>Read View</code>（m_ids 列表）</li></ul><h3 id="_5、-mvcc-解决不可重复读问题" tabindex="-1"><a class="header-anchor" href="#_5、-mvcc-解决不可重复读问题" aria-hidden="true">#</a> 5、 MVCC 解决不可重复读问题</h3><p>在 RC 隔离级别下，事务在每次查询开始时都会生成并设置新的 Read View，所以导致不可重复读</p><p>在可重复读级别下，只会在事务开始后第一次读取数据时生成一个 Read View（m_ids 列表）</p><h3 id="_6、mvcc➕next-key-lock-防止幻读" tabindex="-1"><a class="header-anchor" href="#_6、mvcc➕next-key-lock-防止幻读" aria-hidden="true">#</a> 6、MVCC➕Next-key-Lock 防止幻读</h3><p><code>InnoDB</code>存储引擎在 RR 级别下通过 <code>MVCC</code>和 <code>Next-key Lock</code> 来解决幻读问题：</p><p><strong>1、执行普通 <code>select</code>，此时会以 <code>MVCC</code> 快照读的方式读取数据</strong></p><p>在快照读的情况下，RR 隔离级别只会在事务开启后的第一次查询生成 <code>Read View</code> ，并使用至事务提交。所以在生成 <code>Read View</code> 之后其它事务所做的更新、插入记录版本对当前事务并不可见，实现了可重复读和防止快照读下的 “幻读”。</p><p><strong>2、执行 select...for update/lock in share mode、insert、update、delete 等当前读</strong></p><h2 id="_9、sql语句在mysql中的执行过程" tabindex="-1"><a class="header-anchor" href="#_9、sql语句在mysql中的执行过程" aria-hidden="true">#</a> 9、SQL语句在MySQL中的执行过程</h2><p><img src="https://pictured-bed.oss-cn-beijing.aliyuncs.com/img/2022/6/202206161726856.png" alt="image-20220616172648778" loading="lazy"></p><p>主要包含server层以及存储引擎层。</p><p>连接器：校验身份。</p><p>分析器：解析你的sql，提取关键字以及语法检查。</p><p>优化器：选择索引以及关联顺序，具体如何执行。</p><p>执行器：选择了执行方案后，MySQL 就准备开始执行了，首先执行前会校验该用户有没有权限，如果没有权限，就会返回错误信息，如果有权限，就会去<strong>调用引擎的接口</strong>，返回接口执行的结果。</p><blockquote><p>流程</p></blockquote><p>查询不会做binlog、redo log日志</p><p>查询：</p><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>先检查该语句是否有权限，如果没有权限，直接返回错误信息，如果有权限，在 MySQL8.0 版本以前，会先查询缓存，以这条 SQL 语句为 key 在内存中查询是否有结果，如果有直接缓存，如果没有，执行下一步。

通过分析器进行词法分析，提取 SQL 语句的关键元素，比如提取上面这个语句是查询 select，提取需要查询的表名为 tb_student，需要查询所有的列，查询条件是这个表的 id=&#39;1&#39;。然后判断这个 SQL 语句是否有语法错误，比如关键词是否正确等等，如果检查没问题就执行下一步。

接下来就是优化器进行确定执行方案，上面的 SQL 语句，可以有两种执行方案：

  a.先查询学生表中姓名为“张三”的学生，然后判断是否年龄是 18。
  b.先找出学生中年龄 18 岁的学生，然后再查询姓名为“张三”的学生。
那么优化器根据自己的优化算法进行选择执行效率最好的一个方案（优化器认为，有时候不一定最好）。那么确认了执行计划后就准备开始执行了。

进行权限校验，如果没有权限就会返回错误信息，如果有权限就会调用数据库引擎接口，返回引擎的执行结果。
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>更新：</p><div class="language-text ext-text line-numbers-mode"><pre class="language-text"><code>先查询到张三这一条数据，如果有缓存，也是会用到缓存。
然后拿到查询的语句，把 age 改为 19，然后调用引擎 API 接口，写入这一行数据，InnoDB 引擎把数据保存在内存中，同时记录 redo log，此时 redo log 进入 prepare 状态，然后告诉执行器，执行完成了，随时可以提交。
执行器收到通知后记录 binlog，然后调用引擎接口，提交 redo log 为提交状态。
更新完成。
</code></pre><div class="line-numbers" aria-hidden="true"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote><p>总结</p></blockquote><p>MySQL 主要分为 Server 层和引擎层，Server 层主要包括连接器、查询缓存、分析器、优化器、执行器，同时还有一个日志模块（binlog），这个日志模块所有执行引擎都可以共用，redolog 只有 InnoDB 有。</p><p>引擎层是插件式的，目前主要包括，MyISAM,InnoDB,Memory 等。</p><p>查询语句的执行流程如下：权限校验（如果命中缓存）---&gt;查询缓存---&gt;分析器---&gt;优化器---&gt;权限校验---&gt;执行器---&gt;引擎</p><p>更新语句执行流程如下：分析器----&gt;权限校验----&gt;执行器---&gt;引擎---redo log(prepare 状态)---&gt;binlog---&gt;redo log(commit状态)</p></div><!----><footer class="page-meta"><div class="meta-item edit-link"><a href="https://gitee.com/changluJava/personal-reading/edit/main/demo/src/zh/interview/MySQL.md" rel="noopener noreferrer" target="_blank" aria-label="编辑此页" class="nav-link label"><!--[--><svg xmlns="http://www.w3.org/2000/svg" class="icon edit-icon" viewbox="0 0 1024 1024" fill="currentColor" aria-label="edit icon"><path d="M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"></path><path d="M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"></path></svg><!--]-->编辑此页<span><svg class="external-link-icon" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false" x="0px" y="0px" viewbox="0 0 100 100" width="15" height="15"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path><polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg><span class="external-link-icon-sr-only">open in new window</span></span><!----></a></div><!----><!----></footer><nav class="page-nav"><a href="/zh/interview/Linux.html" class="nav-link prev" aria-label="Linux"><div class="hint"><span class="arrow left"></span>上一页</div><div class="link"><span class="icon iconfont icon-lock" style=""></span>Linux</div></a><a href="/zh/interview/NIO%E4%B8%8ENetty.html" class="nav-link next" aria-label="Netty"><div class="hint">下一页<span class="arrow right"></span></div><div class="link">Netty<span class="icon iconfont icon-lock" style=""></span></div></a></nav><div class="giscus-wrapper input-top" style="display:block;"><div style="text-align:center">Loading...</div></div><!----><!--]--></main><!--]--><footer class="footer-wrapper"><div class="footer">默认页脚</div><div class="copyright">Copyright © 2022 长路</div></footer><!--]--></div><!--]--><!----><!--]--></div>
    <script type="module" src="/assets/app.e732cc94.js" defer></script>
  </body>
</html>
